思い込み再び

テンプレートパターン

が、なぜか、C++ではできないんじゃないかと思ってみたりしてた俺。
具体例でいくと、

class Hoge{
public:
 int f(int x){return g(x);}
 virtual int g(int x)=0;
}

class Foo :public Hoge{
public:
 int g(int x){return x*x;}
}

main(){
 Hoge* hoge = new Foo();
 std::cout << hoge->f(2) << std::endl;
}

これが、動くのか(?)って思ってた俺。
しかし、ちゃんと4が表示される。はず。(このコードは動かしてない。)


Fooクラスのf(x)は、オーバーライドしてなくて、Hogeクラスのf(x)なんだから、Hogeクラスのf(x)内から呼び出されるg(x)って純粋仮想関数・・・?
って思ってしまった。。。

でもよく考えたらJavaも一緒やね。


なぜか、C++のみ動かないんじゃないかと思い込み。
ちなみに、g(x)を仮想関数にしないとすると、f(x)もオーバーライドしないとFooのg(x)はf(x)からは実行されない。はず。
(上の例では型がHoge*のためf(x)を仮想関数にしないとオーバーライドしてもムリ。)


てか、頭いいよねこういう仕組み。