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

Can we perform deleting object through a pointer to one of its base classes?

定义虚析构函数会导致UB吗?例如:

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

struct B : A { };

A *a = new B;


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

coliru

"Does it cause UB if we define a virtual destructor?"

不,这很好,因为析构函数已声明 virtual。加紧 vtable 并首先调用 ~B 将由 delete 处理。

没关系,只要析构函数是virtual

如果不是析构函数,就不知道删除子类的成员

没问题正是因为析构函数是virtual——否则它就是UB。

也就是说,如果要删除派生类型的对象,通过基类型的指针,那么base的析构函数class必须是virtual,否则就是UB。这确保 正确 析构函数(即派生的析构函数)被调用——这称为运行时多态性。