// 28_28-3.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

// 基底クラス
class ClsA {
protected:
	int a;
public:
	ClsA(int n = 0) { a = n; }
	virtual void disp() { cout << "ClsA a=" << a << '\n'; }
};

// 派生クラス
class ClsB : public ClsA {
private:
	int b;
public:
	ClsB(int n1 = 0, int n2 = 0) : ClsA(n1) { b = n2; }
	void disp() { cout << "ClsB a=" << a << " b=" << b << '\n'; }
};

void func_ra(ClsA &ra)
{
	cout << "func_ra: ";
	ra.disp();
}

void func_rb(ClsB &rb)
{
	cout << "func_rb: ";
	rb.disp();
}

int _tmain(int argc, _TCHAR* argv[])
{
	ClsA aa(10);
	ClsB bb(20, 30);

	try {
		cout << "-----func_ra(ClsA &ra)を呼び出す\n";
		func_ra(aa);
		func_ra(dynamic_cast<ClsA&>(bb));
		cout << "-----func_rb(ClsB &rb)を呼び出す\n";
		func_rb(bb);
		func_rb(dynamic_cast<ClsB&>(aa));
	}
	catch (bad_cast) {
		cout << "不正なキャストが行われました。\n";
	}

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

