三、普通派生类构造函数的写法
定义派生类对象的时候,会按如下步骤执行构造操作:
1)传参 2)根据继承时的声明顺序构造基类 3)给类数据成员开辟空间 4)执行冒号语法后面的语句 5)执行构造函数函数体语句
1 class Base 2 { 3 public: 4 Base(int b) : m_b(b) 5 { 6 } 7 private: 8 int m_b; 9 };10 11 class Derived : public Base12 {13 public:14 //普通派生类构造函数的写法15 Derived(int b, int d) : Base(b), m_d(d)16 {17 }18 private:19 int m_d;20 }; 再写一个多继承的示例:
1 class Base1 2 { 3 public: 4 Base1(int b1) : m_b1(b1) 5 { 6 } 7 private: 8 int m_b1; 9 };10 11 class Base212 {13 public:14 Base2(int b2) : m_b2(b2)15 {16 }17 private:18 int m_b2;19 };20 21 class Derived : public Base1, public Base222 {23 public:24 Derived(int b1, int b2, int d) : Base1(b1), Base2(b2), m_d(d)25 { //注意冒号语法后面的顺序无所谓,创造基类是按照上面的继承声明顺序来进行的...26 }27 private:28 int m_d;29 }; 四、含有虚继承的派生类构造函数的写法
为何要用到虚继承?
虚继承主要是针对多继承时,出现二义性问题而提出的。比如,如下代码就需要用到虚继承,否则的话Derived类继承时,Base类就会不明确。
虚继承构造函数的执行按照如下步骤:
1)传参 2)创建基类,注意这时候需要显示创建所有“有参构造函数”的基类,包括直接基类,间接基类。 3)给类数据成员开辟空间 4)执行冒号语法 5)执行构造函数函数体
注:你可能会疑惑,如下代码不是将Base间接基类创建了3次吗?其实不是这样的,编译器是这样处理的,当最远的派生类Derived创建了基类Base之后,其直接基类创建Base类的语句将会被忽略掉。
1 class Base 2 { 3 public: 4 Base(int b) : m_b(b) 5 { 6 } 7 private: 8 int m_b; 9 };10 11 class Base1 : virtual public Base12 {13 public:14 Base1(int b, int b1) : Base(b), m_b1(b1)15 {16 }17 private:18 int m_b1;19 };20 21 class Base2 : virtual public Base22 {23 public:24 Base2(int b, int b2) : Base(b), m_b2(b2)25 {26 }27 private:28 int m_b2;29 };30 //虚继承,避免二义性31 class Derived : public Base1, public Base232 {33 public:34 Derived(int b, int b1, int b2, int d) : Base(b), Base1(b, b1), Base2(b, b2), m_d(d)35 { //注意冒号语法后面的顺序无所谓,创造基类是按照上面的继承声明顺序来进行的...36 }37 private:38 int m_d;39 }; } |