原创 虚继承

2021-8-26 14:31 1510 7 7 分类: 软件与OS 文集: C++基础
一、虚继承
----解决菱形继承问题
A 虚基类
/ \
B C 中间子类
\ /
D 汇聚子类
如果按上面例子直接写继承,在D类中访问A中的成员会有歧义,
这是需要用到 虚继承 virtual
虚继承:在中间子类的继承方式前加 virtual 之后,
汇聚子类中就只保留一份儿来自A的成员
#include <iostream>
  • using namespace std;
  • class A{
  • protected:
  • int a;
  • public:
  • A(int a):a(a){cout<<"A 构造"<<endl;}
  • };
  • class B:virtual public A{
  • protected:
  • int b;
  • public:
  • //虽然是在D中调用A的构造函数
  • //但是此处也需要写,原因是:
  • //实例化B 类对象时 需要用到
  • B(int a,int b):A(a),b(b){cout<<"B 构造"<<endl;}
  • };
  • class C:virtual public A{//继承时加上 virtual 关键字,此时就是虚继承
  • protected:
  • int c;
  • public:
  • C(int a,int c):A(a),c(c){cout<<"C 构造"<<endl;}
  • };
  • class D:public B,public C{//先构造 A ,然后B C的构造顺序 取决于此处的书写顺序
  • //最后构造D类
  • private:
  • int d;
  • public:
  • D(int a,int b,int c,int d):A(520),B(a,b),C(a,c),d(d){cout<<"D 构造"<<endl;}
  • //虚继承时需要在汇聚子类中调用虚基类的构造函数,完成对成员的初始化
  • void show(){
  • cout<<a<<endl;//如果不是虚拟继承 这种访问方式 有歧义
  • cout<<b<<endl;
  • cout<<c<<endl;
  • cout<<d<<endl;
  • }
  • };
  • int main(int argc, const char *argv[])
  • {
  • D d1(10,20,30,40);
  • d1.show();
  • return 0;
  • }
  • 复制代码

    作者: 我只是个野指针, 来源:面包板社区

    链接: https://mbb.eet-china.com/blog/uid-me-3968678.html

    版权声明:本文为博主原创,未经本人允许,禁止转载!

    PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    7
    关闭 站长推荐上一条 /3 下一条