Cのオーバーライドについてのメモ

#include "stdio.h"

class Hoge{
public:n	Hoge(void){printf("Hoge void\n");}
	Hoge(int) {printf("Hoge int\n");}
	virtual void foo(void){printf("Hoge foo\n");}//仮想関数
	void bar(void){printf("Hoge bar\n");}
};

class ExHoge1 :public Hoge{
public:n	ExHoge1(){printf("ExHoge1\n");}//スーパークラスのコンストラクタを指定しない
	void foo(void){printf("ExHoge1 foo\n");}
	void bar(void){printf("ExHoge1 bar\n");}
};
class ExHoge2 :public Hoge{
public:n	ExHoge2(){printf("ExHoge2\n");}//スーパークラスのコンストラクタを指定する
	void foo(void){printf("ExHoge2 foo\n");}
	void bar(void){printf("ExHoge2 bar\n");}
};

int main(void){
	Hoge* hoge1 = new ExHoge1();
	Hoge* hoge2 = new ExHoge2();
	hoge1->foo();				//オーバーロードしたメソッドが呼ばれる
	((Hoge*)hoge2)->foo();		//オーバーロードしたメソッドが呼ばれる
	hoge1->bar();				//スーパークラスのメソッドが呼ばれる
	((ExHoge2*)hoge2)->bar();		//オーバーロードしたメソッドが呼ばれる

	scanf("%s");//表示を止めるため

	/*//実行結果
	Hoge void
	ExHoge1
	Hoge int
	ExHoge2
	ExHoge1 foo
	ExHoge2 foo
	Hoge bar
	ExHoge2 bar
	*/

	return 0;
}
  • virtual指定しない場合は、明示的なキャストをしなければオーバーロードしたメソッドを呼び出さない。
    • コンパイルエラーになるわけではないので、java的な多様性を実現するならvirtualを常につけている方がよいっぽい。
    • virtual指定しない場合でも、明示的なキャストをすることで、オーバーライドした内容を呼び出すことはできる。
  • スーパーコンストラクタを明示的に指定するサブクラスのコンストラクタ宣言は
    • ExHoge1() :Hoeg(){} とか ExHoge2() :Hoeg(0){}