Board logo

标题: C++各种构造函数的写法(2) [打印本页]

作者: yuyang911220    时间: 2017-4-21 20:58     标题: C++各种构造函数的写法(2)

三、普通派生类构造函数的写法      
  定义派生类对象的时候,会按如下步骤执行构造操作:
  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 };        }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0