基本クラスの ctor または dtor で仮想関数を呼び出すべきではないことはわかっていますが、最も派生したクラスの仮想関数についてはどうでしょうか。大丈夫ですよね?例えば
class base {
...
virtual void free() = 0;
};
class child : public base {
...
free() {/* free memory */}
~child() {free();}
};
基本クラスの ctor または dtor で仮想関数を呼び出すべきではないことはわかっていますが、最も派生したクラスの仮想関数についてはどうでしょうか。大丈夫ですよね?例えば
class base {
...
virtual void free() = 0;
};
class child : public base {
...
free() {/* free memory */}
~child() {free();}
};
コンストラクタやデストラクタ、基底クラスなどから仮想関数を呼び出すことには何の問題もありません。ただし、それが何をするのかを知っておく必要があります。動的型は構築または破棄されるクラスであるため、構築または破棄されるクラスから派生したクラスでオーバーライドを呼び出すことはありません。特に、関数が純粋な仮想の場合、オーバーライドは取得されず、動作は未定義です。したがって、適切なルールは、「コンストラクターまたはデストラクタから純粋class::free
仮想関数を呼び出さないでください。あなたの例では、純粋仮想ではないため、呼び出しても問題ありません。