说明继承于基类的包含成员对象的派生类的构造函数、析构函数执行顺序
时间: 2024-06-05 13:08:20 浏览: 22
当一个派生类继承了基类并且包含成员对象时,在派生类的构造函数中,首先会调用基类的构造函数,然后依次调用成员对象的构造函数,最后才执行派生类自身的构造函数。在派生类的析构函数中,先执行派生类自身的析构函数,然后依次调用成员对象的析构函数,最后调用基类的析构函数。这确保了所有的对象都已经正确地构造和析构。
相关问题
用C++写一个基类,一个派生类,一个派生的派生,输出他们构造函数、析构函数执行的顺序
以下是用C++写的例子,因为C语言不支持类的概念:
```
#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << "Base Constructor" << endl;
}
virtual ~Base() {
cout << "Base Destructor" << endl;
}
};
class Derived : public Base {
public:
Derived() {
cout << "Derived Constructor" << endl;
}
~Derived() {
cout << "Derived Destructor" << endl;
}
};
class SubDerived : public Derived {
public:
SubDerived() {
cout << "SubDerived Constructor" << endl;
}
~SubDerived() {
cout << "SubDerived Destructor" << endl;
}
};
int main() {
SubDerived subDerived;
return 0;
}
```
输出结果为:
```
Base Constructor
Derived Constructor
SubDerived Constructor
SubDerived Destructor
Derived Destructor
Base Destructor
```
可以看到,构造函数的执行顺序是从基类到派生类,析构函数的执行顺序则相反,从派生类到基类。这是因为在创建对象时,先创建基类,再创建派生类,而在销毁对象时,则是先销毁派生类,再销毁基类。
设计和实现并测试一个哺乳动物Mammal类,再由此派生出狗Dog类,定义一个Dog类的对象,基类和派生类的构造函数与析构函数都输出提示信息,在主函数生成基类和派生类对象,观察基类与派生类的构造函数与析构函数的调用顺序
好的,我理解了你的问题。下面是实现哺乳动物Mammal类和狗Dog类的代码,以及测试代码,你可以参考一下:
```c++
#include <iostream>
using namespace std;
// 哺乳动物类
class Mammal {
public:
Mammal() {
cout << "Mammal构造函数被调用" << endl;
}
virtual ~Mammal() {
cout << "Mammal析构函数被调用" << endl;
}
};
// 狗类
class Dog : public Mammal {
public:
Dog() {
cout << "Dog构造函数被调用" << endl;
}
~Dog() {
cout << "Dog析构函数被调用" << endl;
}
};
int main() {
Mammal* mammal = new Mammal();
cout << "-----------------" << endl;
Dog* dog = new Dog();
cout << "-----------------" << endl;
delete mammal;
cout << "-----------------" << endl;
delete dog;
return 0;
}
```
输出如下所示:
```
Mammal构造函数被调用
-----------------
Mammal构造函数被调用
Dog构造函数被调用
-----------------
Mammal析构函数被调用
-----------------
Dog析构函数被调用
Mammal析构函数被调用
```
可以看到,当我们创建Mammal对象时,只有Mammal的构造函数被调用,当我们创建Dog对象时,先调用Mammal的构造函数,然后再调用Dog的构造函数。当我们删除Mammal和Dog对象时,先调用Dog的析构函数,然后再调用Mammal的析构函数。这就是基类和派生类的构造函数与析构函数的调用顺序。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)