原创 虚继承

2021-8-26 14:31 1484 7 7 分类: 软件与OS 文集: C++基础
一、虚继承
----解决菱形继承问题
A 虚基类
/ \
B C 中间子类
\ /
D 汇聚子类
如果按上面例子直接写继承,在D类中访问A中的成员会有歧义,
这是需要用到 虚继承 virtual
虚继承:在中间子类的继承方式前加 virtual 之后,
汇聚子类中就只保留一份儿来自A的成员
  1. #include <iostream>
  2. using namespace std;
  3. class A{
  4. protected:
  5. int a;
  6. public:
  7. A(int a):a(a){cout<<"A 构造"<<endl;}
  8. };
  9. class B:virtual public A{
  10. protected:
  11. int b;
  12. public:
  13. //虽然是在D中调用A的构造函数
  14. //但是此处也需要写,原因是:
  15. //实例化B 类对象时 需要用到
  16. B(int a,int b):A(a),b(b){cout<<"B 构造"<<endl;}
  17. };
  18. class C:virtual public A{//继承时加上 virtual 关键字,此时就是虚继承
  19. protected:
  20. int c;
  21. public:
  22. C(int a,int c):A(a),c(c){cout<<"C 构造"<<endl;}
  23. };
  24. class D:public B,public C{//先构造 A ,然后B C的构造顺序 取决于此处的书写顺序
  25. //最后构造D类
  26. private:
  27. int d;
  28. public:
  29. D(int a,int b,int c,int d):A(520),B(a,b),C(a,c),d(d){cout<<"D 构造"<<endl;}
  30. //虚继承时需要在汇聚子类中调用虚基类的构造函数,完成对成员的初始化
  31. void show(){
  32. cout<<a<<endl;//如果不是虚拟继承 这种访问方式 有歧义
  33. cout<<b<<endl;
  34. cout<<c<<endl;
  35. cout<<d<<endl;
  36. }
  37. };
  38. int main(int argc, const char *argv[])
  39. {
  40. D d1(10,20,30,40);
  41. d1.show();
  42. return 0;
  43. }

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

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

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

文章评论0条评论)

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