大多数派生类的析构函数中的纯虚拟调用

时间:2013-05-13 20:06:47

标签: c++ virtual-functions

我知道你不应该在基类的ctor或dtor中调用任何虚函数,但是从派生类最多的那个呢?应该没事吧? E.g。

class base {
    ...
    virtual void free() = 0;
};
class child : public base {
    ...
    free() {/* free memory */}
    ~child() {free();}
};

2 个答案:

答案 0 :(得分:7)

嗯,你可以这样做,但*thischild::~child()的动态类型是child,而不是更多的派生。因此,当您有一个覆盖class foo : child的进一步派生类free()时,被覆盖的函数将被调用。

答案 1 :(得分:2)

从构造函数或析构函数,基类或其他方法调用虚函数没有任何问题。但是你必须知道它的作用:动态类型是被构造或销毁的类,因此它不会在从被构造或销毁的类派生的类中调用覆盖。特别是,如果函数是纯虚函数,则不会获得覆盖,并且行为未定义。因此,一个好的规则是“不要从构造函数或析构函数中调用虚函数。在您的示例中,class::free 纯虚拟,所以没有问题叫它。

相关问题