【19软工1班】C++派生类的构造函数和析构函数

用户头像
来自上海海洋大学-田京京发布于:2020-04-21 09:10:37
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。   在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 和构造函数类似,析构函数也不能被继承。与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉。 另外析构函数的执行顺序和构造函数的执行顺序也刚好相反: 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。 请看下面的例子: #include using namespace std; class A{ public:   A(){cout<<"A constructor"<<endl;}   ~A(){cout<<"A destructor"<<endl;} }; class B: public A{ public:   B(){cout<<"B constructor"<<endl;}   ~B(){cout<<"B destructor"<<endl;} }; class C: public B{ public:   C(){cout<<"C constructor"<<endl;}   ~C(){cout<<"C destructor"<<endl;} }; int main(){   C test;   return 0; } 运行结果: A constructor B constructor C constructor C destructor B destructor A destructor
点赞 (26) 回复
发布回复
点击图片