我知道你不应该在基类的ctor或dtor中调用任何虚函数,但是从派生类最多的那个呢?应该没事吧? E.g。
class base {
...
virtual void free() = 0;
};
class child : public base {
...
free() {/* free memory */}
~child() {free();}
};
答案 0 :(得分:7)
嗯,你可以这样做,但*this
内child::~child()
的动态类型是child
,而不是更多的派生。因此,当您有一个覆盖class foo : child
的进一步派生类free()
时,被覆盖的函数将不被调用。
答案 1 :(得分:2)
从构造函数或析构函数,基类或其他方法调用虚函数没有任何问题。但是你必须知道它的作用:动态类型是被构造或销毁的类,因此它不会在从被构造或销毁的类派生的类中调用覆盖。特别是,如果函数是纯虚函数,则不会获得覆盖,并且行为未定义。因此,一个好的规则是“不要从构造函数或析构函数中调用纯虚函数。在您的示例中,class::free
不纯虚拟,所以没有问题叫它。