今天收到盛大的面试,问我一个问题,关于派生类中如何初始化基类对象,我在想派生类对于构造函数不都是先构造基类对象,然后在构造子类对象,但是如果我们在成员初始化列表先初始化派生类的私有成员,在函数内去调用基类的构造函数,能编译通过吗?或者当我们定义了基类的默认构造函数,而没有去在派生类的构造函数中显示的去调用基类的构造函数,会出现什么状况,我想派生类肯定会自动去调用基类的默认构造函数,那么析构函数又怎么样呢?我们都知道派生类的析构函数会先被调用,然后基类的析构函数后被调用,但是我不知道我们是否需要在派生类的析构函数中显示的去调用基类的析构函数吗?这个有待我去验证。
代码一:在派生类中成员初始化列表先初始化派生类的私有成员,不显示的调用基类的构造函数
#include <iostream> using namespace std; class Base { private: int n; public: Base(int m):n(m){ cout<<"constructor is called\n";} ~Base(){} }; class Derive:public Base { private: int n; public: Derive(int m):n(m) { } ~Derive(){} }; int main() { Derive* a = new Derive(10);return 0; }
结果:编译错误,error C2512: “Base”: 没有合适的默认构造函数可用
代码二:在派生类中成员初始化列表先初始化派生类的私有成员,显示的调用基类的构造函数
#include <iostream> using namespace std; class Base { private: int n; public: Base(){ cout<<"default constructor is called\n"; n = 8;} Base(int m):n(m){ cout<<"constructor is called\n";} ~Base(){} }; class Derive:public Base { private: int n; public: Derive(int m):Base(m),n(m) { } ~