0

我知道你不应该在基类的 ctor 或 dtor 中调用任何虚函数,但是从最派生类的那个呢?应该没问题吧?例如

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

2 回答 2

7

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

于 2013-05-13T20:09:51.480 回答
2

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

于 2013-05-13T20:45:24.903 回答