删除抽象类而不是孩子是否可以?是否所有的分配都会被解除分配?
请考虑以下情况作为示例,但请不要将您的答案限制在一个案例中:
struct A {
virtual void fun() = 0;
};
struct B : public A {
void fun() { /* actually doing something here. */ }
};
struct C {
A *a;
void OneTask() {
// (...)
a = new B();
}
void AnotherTask() { /* using fun() in some way. */ }
~C() { delete a; }
};
想法是让OneTask()有多个可能的结果,这会导致指向从A继承的不同类的指针,B只是一个例子;然后在AnotherTask()和C类的其他方法中合理地使用这样的结果。
答案 0 :(得分:2)
你必须在基类中有虚拟析构函数,否则完全破坏派生类就不会发生。
struct A {
virtual void fun() = 0;
virtual ~A()
{
}
};
答案 1 :(得分:1)
是的,如果不知道实际派生类型delete a
指向的是什么,a
完全没问题。
正如shivakumar指出的那样,如果不使基类的析构函数为虚拟,那么删除派生类将不会最终调用基类的析构函数。在你的琐碎例子中,这不是问题,但在现实生活中,你应该总是让你的析构函数变得虚拟。
答案 2 :(得分:0)
如果A有一个虚析构函数,那么A和B的两个析构函数都被成功调用(先是B然后是A),
如果你没有将A的构造函数声明为虚拟,那么在删除期间只会调用A的析构函数,而B的扩展数据可能会泄漏。
struct A {
virtual void fun() = 0;
virtual ~A();
};
struct B : public A {
void fun() { /* actually doing something here. */ }
~B();
};