一、虚继承
----解决菱形继承问题
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
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论