首页 > 代码库 > 虚基类初始化问题
虚基类初始化问题
在包含有继承关系的类里,生成一个派生类对象,要调用构造函数进行初始化此对象,而构造函数的调用顺序是先调用最顶层基类的构造函数,次顶层....等;但在普通继承和虚继承里存在区别
- 普通继承:父类只能由其直接派生类初始化
1 class A 2 { 3 char a; 4 public: 5 A(char _a) :a(_a){ cout << a << endl; } 6 }; 7 8 class B:public A 9 {10 char b;11 public:12 B(char _a, char _b) :A(_a),b(_b){ cout << b << endl; }13 };14 15 class C:public A16 {17 char c;18 public:19 C(char _a,char _c) :A(_a),c(_c){ cout << c << endl; }20 };21 22 class D:public B,public C23 {24 char d;25 public://注意初始化列表,父类只能由其直接派生类初始化,若初始化列表是:A(_a),B(_b),C(_c),D(_d),则出错26 D(char _a,char _b,char _c,char _d):B(_a,_b),C(_a,_c),d(_d){ cout << d << endl; }27 };28 29 void main()30 {31 D d(‘A‘,‘B‘,‘C‘,‘D‘);32 }
虚继承:
基类只能由最底层的派生类初始化,而不是由直接基类初始化,因为虚继承是为了避免多重继承产生的,只能存在一个子对象,所以只能初始化一次,而在多继承里,一个基类可能存在多个直接派生类,为了避免直接派生类多次初始化基类,只能由最底层的派生类来初始化。
1 class A 2 { 3 char a; 4 public: 5 A(char _a) :a(_a){ cout << a << endl; } 6 }; 7 8 class B :virtual public A 9 {10 char b;11 public:12 B(char _a, char _b) :A(_a), b(_b){ cout << b << endl; }13 };14 15 class C :virtual public A16 {17 char c;18 public:19 C(char _a, char _c) :A(_a), c(_c){ cout << c << endl; }20 };21 22 class D :public B, public C23 {24 char d;25 public://初始化列表里包含A(_a),表示虚基类由最底层派生类初始化26 D(char _a, char _b, char _c, char _d) :A(_a), B(_a,_b), C(_a,_c), d(_d){ cout << d << endl; }27 };28 void main()29 {30 D d(‘A‘,‘B‘,‘C‘,‘D‘);31 }
这里说的最底层是指对象的层级
如B b,则B是A的最底层派生类,由b负责初始化b中所包含的A的子对象
D d,则D是A的最底层派生类,由d负责初始化A的子对象
虚基类初始化问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。