关于虚基类那点破事

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值