C++继承中构造与析构顺序详解

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 构造函数的调用顺序

从输出可以清晰地看到:

  1. 当创建Cat对象时,首先调用基类Animal的构造函数
  2. 然后才调用派生类Cat的构

内容推荐

已经到底了哦
已经到底了哦