c++虚继承

背景是:菱形继承

比如一个类C通过继承类A和类B,但是类A和类B又同时继承于公共基类N。示意图如下:
在这里插入图片描述

这种继承方式也存在数据的二义性,这里的二义性是由于他们间接都有相同的基类导致的。 这种菱形继承除了带来二义性之外,还会浪费内存空间

类C中存在 两份的基类N,分别存在类A和类B中,如果数据多则严重浪费空间,也不利于维护, 我们引用基类N中的数据还需要通过域运算符进行区分。例如:

C data;
data.A::m_data1 = 10;
data.B::m_data1 = 10;
 

 解决办法:使用虚继承

使得在派生类中只保留一份间接基类的成员。

在继承方式前面加上 virtual 关键字就是虚继承。

虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类.

虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针。

  1. //间接基类A
  2. class A{
  3. protected:
  4. int m_a;
  5. };
  6. //直接基类B
  7. class B: virtual public A{ //虚继承
  8. protected:
  9. int m_b;
  10. };
  11. //直接基类C
  12. class C: virtual public A{ //虚继承
  13. protected:
  14. int m_c;
  15. };
  16. //派生类D
  17. class D: public B, public C{
  18. public:
  19. void seta(int a){ m_a = a; } //正确
  20. void setb(int b){ m_b = b; } //正确
  21. void setc(int c){ m_c = c; } //正确
  22. void setd(int d){ m_d = d; } //正确
  23. private:
  24. int m_d;
  25. };
  26. int main(){
  27. D d;
  28. return 0;
  29. }

这样在派生类 D 中就只保留了一份成员变量 m_a,直接访问就不会再有歧义了。不然就会有2分成员变量m_a.

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值