多态

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!