C ++删除基于父级指针的子级

问题描述

假设我有A类:

cout<<char(220)

并且B类是A的孩子:

class A {
    A();
};

和A指针的向量:

class B : public A {
    B() : A();
    ~B();
};

现在,我使用以下命令初始化所有内容:

std::vector<A*> a_pointers;

如何删除b_obj对象?应该是这样吗?

B* b_obj = new B();

a_pointers.push_back(b_obj);

行得通吗?如果没有,应该怎么做?

解决方法

您需要为A提供一个虚拟析构函数(有关原因,请参见here

class A {
    A();
public:
    virtual ~A() = default; 
};

此时调用delete a_pointers[0]将完全破坏b_obj

,

如果您专门引用局部变量B* b_obj,则无需删除它。本地变量位于堆栈中,当您从声明该函数的函数返回时将对其进行清理。

如果要引用创建并分配给B* b_obj的对象(即,由new()创建的对象,然后将其引用复制到向量中),则需要将其删除稍后在某个时间明确地调用delete()(您可能需要遍历向量并删除其所有项)。

值得注意的另一件事是,您还需要像Nathan Pierson所说的那样将析构函数声明为虚拟的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...