1. 从动物世界看C++继承中的构造与析构
在C++面向对象编程中,继承机制下的构造函数和析构函数调用顺序,就像观察一个动物家族的诞生与消亡过程。让我们从一个简单的动物类开始,逐步深入这个看似简单却容易踩坑的主题。
先看这段基础代码:
cpp复制#include <iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "调用Animal类构造函数!" << endl;
}
~Animal() {
cout << "调用Animal类析构函数!" << endl;
}
};
int main() {
Animal a;
return 0;
}
运行这个程序,控制台会清晰地显示:
code复制调用Animal类构造函数!
调用Animal类析构函数!
这验证了最基本的对象生命周期:构造在对象创建时调用,析构在对象销毁时(这里是在main函数结束时)自动调用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 继承体系下的构造顺序解析
当我们引入继承关系时,情况变得更有趣。让我们创建一个Cat类继承自Animal:
cpp复制class Cat : public Animal {
public:
Cat() {
cout << "调用Cat类构造函数!" << endl;
}
~Cat() {
cout << "调用Cat类析构函数!" << endl;
}
};
int main() {
Animal a;
cout << "---------分界线--------" << endl;
Cat c;
return 0;
}
运行结果如下:
code复制调用Animal类构造函数!
---------分界线--------
调用Animal类构造函数!
调用Cat类构造函数!
调用Cat类析构函数!
调用Animal类析构函数!
2.1 构造函数的调用顺序
从输出可以清晰地看到:
- 当创建Cat对象时,首先调用基类Animal的构造函数
- 然后才调用派生类Cat的构
