如果定义虚拟析构函数会导致UB吗?对于intance:
struct A{ virtual ~A(){ } };
struct B : A { };
A *a = new B;
int main()
{
delete a; //UB?
}
答案 0 :(得分:2)
很好正是因为析构函数是virtual
- 否则它就是UB。
换句话说,如果你想通过基类型的指针删除派生类型的对象,那么基类的析构函数必须是 virtual
,否则它将是UB。这可以确保调用正确的析构函数(即派生的析构函数) - 称为运行时多态性。
答案 1 :(得分:1)
"如果我们定义虚拟析构函数会导致UB吗?"
当析构函数被声明为virtual
时,不行。加紧vtable
并首先致电~B
将由delete
处理。
答案 2 :(得分:1)
只要析构函数为virtual
,就可以了。
如果destuctor不是,它将不知道删除子类的成员。