为什么我的破坏者只称呼一次,而不是在删除(a)调用上


using namespace std;
class A {};
class B {};
class C : public A {
    public:
    C(){ b = new B();}
    B* b;
    ~C(){
        printf("in destructorn");
        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 1n");
    doSomething(*a);
    printf("Line 2n");
    delete(a);
    return 0;
}

输出是:

Line 1
in destructor
Line 2

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

为什么我看不到两次被命令的命令器?我希望在doSomething函数的末尾和delete调用。

为什么doSomething函数称呼驱动器?为什么delete(a)不会导致错误?

您缺少 A中的 virtual destructor,因此未定义的行为。默认一个用于定义的行为。

class A {
public:
    virtual ~A() = default;  
};

相关内容

最新更新