多態

#include <iostream>
using namespace std;

class A
{
protected:
	int a;
public:
	A() :a(1111) {}
	virtual void Show() { std::cout << a << std::endl; }
	void ShowInfo() { std::cout <<"A" << std::endl; }
};

class B:public A
{
private:
	int b;
public:
	B() :b(2222) {}
	virtual void Show(){std::cout << b << std::endl;}
	void ShowInfo() { std::cout << "B" << std::endl; }
	void ShowInfoB() { std::cout << "Class B" << std::endl; }
};

class C :public B
{
private:
	int c;
public:
	C() :c(3333) {}
	virtual void Show(){std::cout << c << std::endl;}
	void ShowInfo() { std::cout << "C" << std::endl; }
	void ShowInfoC() { std::cout << "Class C" << std::endl; }
};

int main()
{
	B b;
	C c;

	A* pa = &b;
	pa->Show();			// 2222
	pa->ShowInfo();		// A
	//pa->ShowInfoB();	// 無法調用
	pa = &c;
	if (!pa) return -1;
	pa->Show();			// 3333
	pa->ShowInfo();		// A
	//pa->ShowInfoC();	// 無法調用
	// 無法讓指向派生類的基類指針 調用 派生類的非虛函數,必須先轉化爲相應的派生類指針

	auto pb = dynamic_cast<B*>(pa);// pb類型爲B*
	if (!pb) return -1;
	pb->Show();			// 3333
	pb->ShowInfo();		// B
	pb->ShowInfoB();	// Class B(調用成功)

	auto pc = dynamic_cast<C*>(pa);// pc類型爲C*
	if (!pc) return -1;
	pc->Show();			// 3333
	pc->ShowInfo();		// C
	pc->ShowInfoC();	// Class C(調用成功)

	pa = &b;
	auto ppb = dynamic_cast<B*>(pa);// pb類型爲B*
	if (!ppb) return -1;
	ppb->Show();		// 2222
	ppb->ShowInfo();	// B
	ppb->ShowInfoB();	// Class B(調用成功)

	auto ppc = dynamic_cast<C*>(pa);// 轉換失敗,因爲pa指向的是B,無法向下(B的派生類轉)化爲,ppc爲NULL;
	if (!ppc) return -1;
	return 0;
}
/*
您不能使用指向基類的指針來調用派生類的非虛擬成員函數.
您將需要一個指向派生類的指針.最簡單的方法是使用dynamic_cast獲取指向派生類的指針, 檢查強制轉換是否成功, 然後使用派生類指針調用派生類成員函數.
更好的方法是在基類中提供虛擬成員函數, 並在派生類中實現它.
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章