// 仮想関数のオーバーライドは返り値、引数とも
// 変更されてもいいのいか。の検証

#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