一、虚继承
----解决菱形继承问题
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条评论)
登录后参与讨论