派生类不能在成员初始化列表中直接初始化基类的成员

派生类不能在成员初始化列表中直接初始化基类的成员

初始化基类成员

构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员,“越级初始化”。派生类的构造函数的一般格式为:

派生类名(形参表):基类名1(形参表1),基类名2(形参表2)···

{···}

注意事项:

(1)在创建派生类对象时,先调用基类的构造函数,然后调用派生类的构造函数;撤销对象时,析构函数被调用的顺序则相反。

(2)若派生类中包含对象成员,则派生类的构造函数初始化成员列表中既要列出基类的构造函数也要列出对象的构造函数。派生类定义对象时,先调用基类的构造函数,再调用对象的构造函数,最后调用派生类的构造函数。

像 c++ primer习题15.16 (a)

  1. struct base
  2. {
  3. base(int val):id(val){}
  4. protected:
  5. int id;
  6. };
  7. struct c1:public base
  8. {
  9.     c1(int val):id(val){}
  10. };
  11. 编译会产生如下错误:
  12. 1>.\1508.cpp(12) : error C2512: “base”: 没有合适的默认构造函数可用
  13. 1>.\1508.cpp(12) : error C2614: “c1”: 非法的成员初始化:“id”不是基或成员

你可能感兴趣的:(C/C++/数据结构与算法)