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キーワードを付けなくてもオーバーライドできてる。

美しいC++プログラミング見本帖

美しいC++プログラミング見本帖

この本のp.264ページによると、virtualキーワードの働きは、

仮想関数の仕組みにより、ポインタが指すオブジェクトの種類に応じて、「実際のオブジェクトの型がプログラムの実行時に動的に解決される」からです(これは、実行時バインディングと呼ばれます)。

とある。

とすると、静的に型を指定する場合には、virtualキーワードを付けなくてもオーバーライドができるのか。

また、動的に型を解決したい場合でも、static_castとかってしておけば、親クラスのポインタ型でも子クラスのメンバー関数が呼べるらしい。

う〜ん、何とも。しっくりこないけど、こんなもん?て理解でいいのかなぁ。