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