virtualキーワード
今までvirtualキーワードの意味を勘違いしていたらしい。
たとえば、このようなコードがある場合、
#include <iostream> #include <string> class Base { public: Base() {} const char* name() { return "Base"; } }; class Child : public Base { public: Child() : Base() {} const char* name() { return "Child"; } }; int main(int argc, char** argv) { Base base; std::cout << "Base名: " << base.name() << std::endl; Child child; std::cout << "Child名: " << child.name() << std::endl; return 0; }
実行結果
Base名: Base
Child名: Child
nameメンバー関数をオーバーライドするのにvirtualキーワードが必須だと思っていた。
すなわち、上記のコードの場合は、Child型を宣言してようとしてまいと、実行結果が
Base名: Base
Child名: Base
と言うように、virtualキーワードを付けない場合は、親クラスのメンバー関数か、もしくはコンパイルエラーになるもんだと思ってた。
でも、実際はvirtualキーワードを付けなくてもオーバーライドできてる。
- 作者: 柏原正三
- 出版社/メーカー: 翔泳社
- 発売日: 2004/10/09
- メディア: 単行本
- 購入: 1人 クリック: 6回
- この商品を含むブログ (17件) を見る
仮想関数の仕組みにより、ポインタが指すオブジェクトの種類に応じて、「実際のオブジェクトの型がプログラムの実行時に動的に解決される」からです(これは、実行時バインディングと呼ばれます)。
とある。
とすると、静的に型を指定する場合には、virtualキーワードを付けなくてもオーバーライドができるのか。
また、動的に型を解決したい場合でも、static_cast
う〜ん、何とも。しっくりこないけど、こんなもん?て理解でいいのかなぁ。