我们可以通过指向其基数 类 之一的指针来执行删除对象吗?
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?
}
"Does it cause UB if we define a virtual destructor?"
不,这很好,因为析构函数已声明 virtual
。加紧 vtable
并首先调用 ~B
将由 delete
处理。
没关系,只要析构函数是virtual
。
如果不是析构函数,就不知道删除子类的成员
没问题正是因为析构函数是virtual
——否则它就是UB。
也就是说,如果要删除派生类型的对象,通过基类型的指针,那么base的析构函数class必须是virtual
,否则就是UB。这确保 正确 析构函数(即派生的析构函数)被调用——这称为运行时多态性。
定义虚析构函数会导致UB吗?例如:
struct A{ virtual ~A(){ } };
struct B : A { };
A *a = new B;
int main()
{
delete a; //UB?
}
"Does it cause UB if we define a virtual destructor?"
不,这很好,因为析构函数已声明 virtual
。加紧 vtable
并首先调用 ~B
将由 delete
处理。
没关系,只要析构函数是virtual
。
如果不是析构函数,就不知道删除子类的成员
没问题正是因为析构函数是virtual
——否则它就是UB。
也就是说,如果要删除派生类型的对象,通过基类型的指针,那么base的析构函数class必须是virtual
,否则就是UB。这确保 正确 析构函数(即派生的析构函数)被调用——这称为运行时多态性。