多态

#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获取指向派生类的指针, 检查强制转换是否成功, 然后使用派生类指针调用派生类成员函数.
更好的方法是在基类中提供虚拟成员函数, 并在派生类中实现它.
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值