为什么我的析构函数仅被调用一次,而不在delete(a)调用上被调用?

use*_*641 2 c++ oop inheritance destructor class

using namespace std;

class A {};

class B {};

class C : public A {
    public:
    C(){ b = new B();}
    B* b;
    ~C(){
        printf("in destructor\n");
        delete b;
    }
};

void doSomething(A&aref)
{
    C c = (C &) aref;
    c.b = new B();
    int i;
}

int main()
{      
    A * a;

    a = new C();
    printf("Line 1\n");
    doSomething(*a);
    printf("Line 2\n");

    delete(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出为:

Line 1
in destructor
Line 2
Run Code Online (Sandbox Code Playgroud)

尝试删除delete(a)并获得相同的结果。

为什么我看不到析构函数两次调用?我希望可以在doSomething函数末尾和delete调用时调用它。

为什么doSomething函数调用析构函数?为什么不delete(a)引起错误?

JeJ*_*eJo 5

您缺少中的virtual析构函数A,因此未定义行为。定义行为的默认值。

class A {
public:
    virtual ~A() = default;  
};
Run Code Online (Sandbox Code Playgroud)

  • 这是一个常见的错误,我宁愿引入一个编译器警告,即在没有畜栏析构函数的情况下继承一个类,并有一个特殊的显式标记来禁用它 (2认同)