---- C# ----
public class Base {
public Base() { initialize(); } // 初期化メソッドを呼ぶ
public virtual void initialize()
{ System.Console.WriteLine("Base::initialize"); }
}
public class Derived : Base {
public override void initialize() // 初期化メソッドを再定義
{ System.Console.WriteLine("Derived::initialize"); }
}
public class Program {
public static void Main() {
Base b = new Derived();
}
}
---- 実行結果 ----
Derived::initialize
Derivedをnewしたんだから初期化メソッドは当然Derived::initializedだよね、と。
# JavaもC#と同じ挙動を示します。
ところがC++は違います。
---- C++ ----
#include <iostream>
class Base {
public:
Base() { initialize(); }
virtual void initialize()
{ std::cout << "Base::initialize\n"; }
};
class Derived : public Base {
public:
virtual void initialize()
{ std::cout << "Derived::initialize\n"; }
};
int main() {
Base* b = new Derived();
delete b;
}
---- 実行結果 ----
Base::initialize
Derivedのコンストラクトに先立って基底クラスであるBaseのコンストラクトが行われます。
Baseのコンストラクタ内で呼ばれたinitializeについて
"BaseのコンストラクトなんだからBaseのメソッドが呼ばれるのがスジ"
と考え、Base::initializeが動きます。
基底クラスのコンストラクトを導出クラスに撹乱されてなるものかってーぽりしぃですわね。
どちらが正しいてのはないのでしょうが、僕はC++の堅実さが好ましく感じられます。
が、一方で初期化メソッドを再定義したいって思いも強くあります。
…あなたはどちらがお好みですか?