我正在从作者Abhiram Ranade的书中学习OOP,并且我对Virtual Destructors有概念上的疑问。
当谈论与超类和子类对象的分配混合时,它说如果B是A的子类,则允许下面的前两个分配,以及反向arent。 B不在A中的其他成员被删除。
a = b
PtrA = &b
但是,当谈到虚拟析构函数时;让我们接受以下代码。
class A {
public:
virtual ~A() {cout<<"~A.\n";}
};
class B: public A{
int *z;
public :
B(){z = new int;}
~B(){
out <<"~B.\n";
delete z;
}
};
int main(){
A* aptr;
aptr = new B;
delete aptr;
}
这本书说,如果我们不将A的析构函数声明为虚拟的,则在操作之后删除aptr;在主程序中,分配给z的内存不会被释放。
我不明白的是,当我们将类型B的对象分配给类型A的指针时,是否不应该将像int z这样的其他成员放在首位呢?那么为什么要为z分配内存?
不在A中的B的其他成员应被删除,因此,即使仅调用A的析构函数,也不应将其定义为不确定的行为。我哪里错了?