将子对象分配给其超类的指针时,为子类的其他数据成员分配内存

时间:2018-12-08 18:11:21

标签: polymorphism variable-assignment destructor

我正在从作者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的析构函数,也不应将其定义为不确定的行为。我哪里错了?

0 个答案:

没有答案