#include < iostream >
using namespace std;
class base
{
public :
base ()
{
a = 5 ;
cout << " base a= " << a << endl;
cout << " base constructing... " << endl;
}
protected :
int a;
};
class base1: virtual public base // 声明虚基类
{
public :
base1()
{
a = a + 10 ;
cout << " base1 a= " << a << endl;
cout << " base 1 constructing... " << endl;
}
};
class base2: public base // 不 声明虚基类
{
public :
base2()
{
a += 20 ;
cout << " base2 a= " << a << endl;
}
};
class derived: public base1, public base2
{
public :
derived()
{
cout << " derived a= " << base2::a << endl; // 要 有作用域区分符,否则有二义性
cout << " derived constructing... " << endl;
}
};
void main()
{
derived obj;
}
使用虚基类需要3层类结构,派生类的多个直接基类有共同的父类时,将该父类声明为虚基类,可以解决二义性
如果不全声明,意义就不大
比如下面这个结构,你可以试验一下
A
/ | /
B C D
/ | /
E
假设 B, C, D都虚继承 A
那么 E 的对象中只有1个A的对象
如果 B,C, D有两个虚继承,一个不是
那么E 的对象中只有2个A的对象
如果 B,C, D有一个虚继承A,两个不是
那么E 的对象中只有3个A的对象
如果 B,C, D都不是虚继承A
那么E 的对象中也是有3个A的对象
所以如果不全虚继承,我觉得意义不大
http://topic.youkuaiyun.com/u/20090712/21/6efb52b3-3c2f-49be-b049-32e228300c3f.html
关于虚基类那点破事
最新推荐文章于 2025-08-10 22:47:29 发布