派生类包含指向基类对象的指针时的析构函数

Destructor when derived class contains a pointer to base class object

本文关键字:指针 析构函数 对象 基类 包含指 派生      更新时间:2023-10-16

我已经编写了一个纯虚拟析构函数,并在抽象基类中实现了它,并在派生类中重写它。

然而,在其中一个类中,我有一个指向基类对象的指针
现在,派生类的析构函数应该这样写吗:

virtual ~DerivedClass()
{
delete this->pointerToAnotherDerivedClassObject;
}

还是会自动删除对象?由于基类析构函数总是被调用的,所以我无法决定它是否处理它。

EDIT:我错误地说它是指向基类的指针,因为它实际上是指向另一个派生类对象的指针。

然而,在其中一个类中,我有一个指向基类对象的指针。现在,派生类的析构函数应该这样写吗

由于pointerToAnotherDerivedClassObject指向内存中的另一个对象,因此是的,您的DerivedClass析构函数需要显式地delete该对象(或将原始指针封装在智能指针std::auto_ptrstd::unique_ptrstd::shared_ptr中,并使其成为您的对象delete仅当DerivedClass要拥有另一个对象时。否则,如果您不拥有它,就不要delete

@Elia类似的情况在Eckel的书"C++中的思考vol-2"中的设计模式第10章中讨论了伪虚拟构造函数。问题的答案是,考虑到动态分配,您确实需要删除它。此外,不要将成员Base*与Base对象混淆,后者是由于继承而派生的一部分,一个是数据成员(这是您想要删除的),另一个是由于继承。