编程参考 - C++ virtual base class

C++支持多重继承,有可能出现继承列表里的类有同一个父类的情况,比如下面这样:

A是base class,B、C、D都继承A。

逻辑上关系可以看成上面那样,但实际在内存布局中(memory layout),却是:

这样对子类D来说,就包含了两份A的数据成员。

这就出现了问题,在D中引用A的数据成员时,引用的是哪一个呢?

这种菱形继承来说,本来就是应该避免的,出现了也就意味着你的类设计上有了问题。

不过为了解决这个问题,C++引入了一个虚继承的机制,就是在继承一个类时,在public前或后加上virtual关键字,表明此父类对象只有一份拷贝。

我们就说这个被虚继承的类叫做virtual base class。如果不使用虚继承,当编译的时候就会报错了,可以自己修改试一下。

举例如下:

#include <iostream>

using namespace std;

class A {

   public:

   int a;

   A(){

      a = 10;

   }

};

class B : public virtual A {

};

class C : virtual public A {

};

class D : public B, public C {

};

int main(){

   //creating class D object

   D object;

   cout << "a = " << object.a << endl;

   return 0;

}

当然,天下没有免费的午餐,使用virtual inheritance,自然要承担代价。

这个成本就是调用方式的改变,增加了操作降低了性能。

实现原理可以看这篇文章:

https://web.archive.org/web/20160413064252/http://www.phpcompiler.org/articles/virtualinheritance.html

一言难尽,简单说就是将偏移地址存储在vtable中,这样想调用公共父类的成员时可以计算出地址。

参考:

In C++, what is a virtual base class? - Stack Overflow

Virtual base class in C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值