多重继承/菱形继承(virtual)(虚基类)

1、一个我从来没见过的场景

A作为基类
B、C均public继承自A
D同时继承自B、C

class A
{
   
public:
	A() : number(-1) {
    cout << "A()" << endl; }
	A(int n) : number(n) {
    cout << "A(" << n << ")" << endl; }
	int get_num() {
    return 10 * number; }
	int number;
};

class B : public A
{
   
public:
	B(int n) : A(n) {
    cout << "B(" << n << ")" << endl; }
};

class C : public A
{
   
public:
	C(int n) : A(n) {
    cout << "C(" << n << ")" << endl; }
};

class D : public B, public C
{
   
public:
	D() : B(1), C(2) {
    cout << "D()" << endl; }
};

上述构造class的方式没有问题,你可以实例化一个D类型的对象。

不过,一个很明显的问题是:B、C中均包含了继承自A的成员,而D又同时包含了B和C,那么相当于D中有了2份A。这样4者的继承关系类似于一个菱形,所以称为菱形继承问题。

严格来说,菱形继承本身不算是问题,因为上述的代码是可以用的,只是在使用D的实例时,需要明确区分是使用父类B的成员还是使用父类C的成员。

int main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值