虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
demo1#include <iostream>
using namespace std;
class B
{
public:
int b;
protected:
private:
};
class B1 : virtual public B
{
public:
int b1;
};
class B2 : virtual public B
{
public:
int b2;
};
class C : public B1, public B2
{
public:
int c;
};
int main()
{
C c1;
c1.b1 = 100;
c1.b2 = 200;
c1.c = 300;
c1.b = 500; //继承的二义性 和 虚继承解决方案
//c1.B1::b = 500;
//c1.B2::b = 500;
return 0;
}总结:
总结:
如果一个派生类从多个基类派生,而这些基类又有一个共同 的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象。
要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,使这个基类成为虚基类。
虚继承声明使用关键字 virtual。
注意增加virtual关键字后,构造函数调用的次数。
demo2
#include <iostream>
using namespace std;
class B
{
public:
B()
{
cout<<"B构造函数执行\n";
}
int b;
protected:
private:
};
class B1 : virtual public B //12
{
public:
int b1;
};
class B2 : public B //8
{
public:
int b2;
};
class C : public B1, public B2
{
public:
int c;
};
int main()
{
cout<<sizeof(B)<<endl; //4
cout<<sizeof(B1)<<endl; //12 //加上virtual以后 , C++编译器会在给变量偷偷增加属性
cout<<sizeof(B2)<<endl; //8
//cout<<sizeof(B)<<endl;
<span style="white-space:pre"> </span>return 0;
}
注意:另一种情况虚继承不能处理
demo3
class D1
{
public:
int k;
protected:
private:
};
class D2
{
public:
int k;
protected:
private:
};
class E : public D1, public D2
{
public:
protected:
private:
};
int main()
{
E e1;
e1.D1::k = 100;
e1.D2::k = 200;
return 0;
}
多继承原理抛砖 - 虚继承的应用场景 - 虚继承能解决的问题有限
原文地址:http://blog.csdn.net/zyq522376829/article/details/46504045