C ++では、コンストラクター内から仮想関数が呼び出されると、仮想関数のようには動作しません。
この振る舞いに初めて遭遇した人は誰もが驚いたと思いますが、考え直してみると、それは理にかなっています。
派生コンストラクターが実行されていない限り、オブジェクトはまだ派生インスタンスではありません。
では、派生関数をどのように呼び出すことができますか?前提条件を設定する機会がありませんでした。例:
class base {
public:
base()
{
std::cout << "foo is " << foo() << std::endl;
}
virtual int foo() { return 42; }
};
class derived : public base {
int* ptr_;
public:
derived(int i) : ptr_(new int(i*i)) { }
// The following cannot be called before derived::derived due to how C++ behaves,
// if it was possible... Kaboom!
virtual int foo() { return *ptr_; }
};
Javaと.NETでもまったく同じですが、反対の方向に進むことを選択しました。おそらく、驚き最小の原則の唯一の理由は何でしょうか。
どちらが正しい選択だと思いますか?