析构函数在 C++ 中被调用两次

Destructor called two times in C++

我有一个包含两个 class 的代码,如下所示:

Class答:

class A {
    int a, b;
public:
    A(int x, int y) {
        a = x;
        b = y;
    }
    ~A() {
        cout << "Exit from A\n";
    }
    void values() {
        cout << a << "\n" << b << endl;
    }
};

Class乙:

class B :public A
{
    int c;
public:
    B(int x, int y, int z) :A(x, y)
    {
        c = z;
    }
    ~B() {
        cout << "Exit from B\n";
    }
    void values() {
        A::values();
        cout << c << endl;
    }
};

主要功能:

int main()
{
    A testA(1, 2);
    testA.values();
    B testB(10, 20, 30);
    testB.values();
}

这就是我得到的:

1
2
10
20
30
Exit from B
Exit from A
Exit from A

首先从 class B 调用析构函数,然后从 A 调用两次。为什么是两次?不知道怎么改。

maintestAtestBA 基础子对象中创建了 2 个 A 对象。两者都在 main 的末尾被销毁,顺序与它们的声明顺序相反。

class A {
    int a, b;
    std::string msg;
protected:
    A(int x, int y, std::string m) : a(x), b(y), msg(m) {}
public:
    A(int x, int y) : A(x, y, "Exit from A\n") {}
    virtual ~A() {
        std::cout << msg;
    }
    virtual void values() {
        std::cout << a << "\n" << b << std::endl;
    }
};

class B :public A
{
    int c;
public:
    B(int x, int y, int z) : A(x, y, "Exit from B\n"), c(z) {}
    void values() override {
        A::values();
        std::cout << c << std::endl;
    }
};

您有对象 testA,它将从 A (1) 调用它的析构函数。 您有从 A 派生的对象 testB,因此它将调用析构函数 B (1) 和析构函数 A (2).

这正是您的输出内容。