C++非抽象析构函数继承

Rus*_*han 1 c++ inheritance c++11

我以前见过这个问题,但不清楚或与我遇到的情况相同.

我有一个抽象的基类.它有一个受保护的构造函数和一个析构函数.它由几个完整的类型继承,它们也有公共构造函数和析构函数.我遇到的问题是,如果对象被基类型引用,则删除对象不会调用子析构函数.

class Tree
{
protected:
        Tree(){ }
public:
        ~Tree(){ }
};

class OakTree : public Tree
{
public:
        OakTree(){ }
        ~OakTree(){ }
};

vector<Tree*> Trees; // Store objects using the base type
Trees.push_back(new OakTree()); // Create derived object
delete Trees[0]; // OakTree desctructor does not get called
Run Code Online (Sandbox Code Playgroud)

如何调用OakTree析构函数?我已经尝试将所有析构函数标记为虚拟,但这不起作用.基类析构函数不能是抽象的(这将解决调用问题,但不能解决删除问题).

And*_*mas 7

制作基类析构函数virtual.

class Tree
{
protected:
        Tree(){ }
public:
        virtual ~Tree(){ }
}
Run Code Online (Sandbox Code Playgroud)

否则,如果尝试通过基类指针删除,将导致未定义的行为.这有点过时了,但Scott Meyers在Effective C++第二版中表达了这一点:

C++语言标准在这个主题上非常清楚:当您尝试通过基类指针删除派生类对象并且基类具有非虚拟析构函数(如同EnemyTarget)时,结果是未定义的.这意味着编译器可以生成代码来执行他们喜欢的任务:重新格式化磁盘,向老板发送暗示性邮件,将源代码传真给竞争对手,等等.(在运行时经常发生的事情是派生类的destrutcor永远不会被调用....)