// 仮想関数のオーバーライドは返り値、引数とも // 変更されてもいいのいか。の検証 #include <iostream> using namespace std; // 抽象クラス class Basic { public: int a; Basic( ) { a = 0; }; virtual ~Basic( ) {}; virtual void foo( ) = 0 ; // 純粋仮想関数 // 返り値なし、の引数なし }; // 派生クラス1 class Sub : public Basic { public: // overriding void foo( ) { cout << "I'm Sub. " << endl; } void foo( int i_in ) { cout << "I'm Sub.foo( int ). in:" << i_in << endl; } int foo( int i_in , char *szBuf ) { cout << "I'm Sub.foo( int ). in:" << i_in << szBuf << endl; return 1; } }; // 派生クラス2 class Sub2 : public Basic { public: // overriding void foo( ) { cout << "I'm Sub2" << endl; } }; int main( ) { // Polymorphism Basic *pB = new Sub; Basic *pB2 = new Sub2; // 自クラスのインスタンス Sub *pS = new Sub; // Polymorphism pB->foo( ); // 自分のインスタンス pS->foo( ); pS->foo( 88 ); pS->foo( 90, "Hage!!" ); // Polymorphism pB2->foo( ); delete pB; delete pB2; delete pS; return 0; } /* 1. ダメです。 Polymorphism が有効なのは基底クラスの仮想関数のみ 派生クラスでのオーバーライドは、戻り値、引数とも 変更はできない!! 2. Polymorphism を使用せずに、単に継承して自分のクラスインスタンス と使用する時は、自由にオーバーライドできる。 ただし、関数名が同じで引数並びも同じ関数は、戻り値を変更しても 2つ定義できない。(ま、コンパイラが迷うので当然だが) */ // end of file