我们可以通过指向其中一个基类的指针来执行删除对象吗?

时间:2015-05-01 13:18:00

标签: c++ language-lawyer undefined-behavior

如果定义虚拟析构函数会导致UB吗?对于intance:

struct A{ virtual ~A(){ } };

struct B : A { };

A *a = new B;


int main()
{
    delete a; //UB?
}

coliru

3 个答案:

答案 0 :(得分:2)

很好正是因为析构函数是virtual - 否则它就是UB。

换句话说,如果你想通过基类型的指针删除派生类型的对象,那么基类的析构函数必须是 virtual,否则它将是UB。这可以确保调用正确的析构函数(即派生的析构函数) - 称为运行时多态性。

答案 1 :(得分:1)

  

"如果我们定义虚拟析构函数会导致UB吗?"

当析构函数被声明为virtual时,不行。加紧vtable并首先致电~B将由delete处理。

答案 2 :(得分:1)

只要析构函数为virtual,就可以了。

如果destuctor不是,它将不知道删除子类的成员。