思い込み再び
テンプレートパターン
が、なぜか、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)を仮想関数にしないとオーバーライドしてもムリ。)
てか、頭いいよねこういう仕組み。