002c++中的强制类型转换dynamic

//002c++中的强制类型转换dynamic
#include<iostream>
using namespace std;
/*
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:
TYPE b = (TYPE)a
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。
  static_cast		静态类型转换。如int转换成char
  reinterpreter_cast	重新解释类型
  dynamic_cast		命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
  const_cast,		字面上理解就是去const属性。
  4种类型转换的格式:
  TYPE B = static_cast<TYPE> (a)
  */

class tree{};

class Animal
{
public:
	virtual void cry()=0;//这里没有函数的实现,必须写成纯虚函数的形式
};

class Dog:public Animal
{
public:
	virtual void cry() 
	{
		cout << "旺旺" << endl;
	}
	void doHome()
	{
		cout << "我是狗,我会看家" << endl;
	}
};

class Cat:public Animal
{
public:
	virtual void cry() 
	{
		cout << "喵喵" << endl;
	}
	void dosomething()
	{
		cout << "我是猫,我会抓老鼠" << endl;
	}
};


void playObjetc(Animal*pBase)
{
	pBase->cry();// 1有继承 2虚函数重写 3 父类指针 指向子类对象  ==>多态
	//dynamic_cast运行时类型识别 RIIT
	Dog *pdog = dynamic_cast<Dog*>(pBase);//把父类指针转换成子类指针
	if (pdog!=NULL)
	{
		pdog->doHome();//做自己特有的工作
	}
	Cat*pCat = dynamic_cast<Cat*>(pBase);//父类对象 ===> 子类对象 向下转型 
	//把老子转换成小子
	if (pCat!=NULL)
	{
		pCat->dosomething();
	}
}

int main(void)
{
	Dog d1;
	Cat c1;
	//Animal a1;//包含纯虚函数的类不允许实例化对象
	Animal*pBase = NULL;
	pBase = &d1;
	//让C++编译在编译的时候进行 类型检查 
	//pBase = static_cast<Animal*>(&d1);

	{
		tree t1;
		//pBase = static_cast<Animal *>(&t1); // C++编译器会做类型检查,error
		//reinterpret_cast 重新解释 ....强制类转换的味道
		pBase = reinterpret_cast<Animal*>(&t1);
		//pBase = dynamic_cast<Animal*>(&t1);//error
		//把一个树类强制转换成一个动物类就会报错

	}

	playObjetc(&d1);
	playObjetc(&c1);
	system("pause");
	return 0;
}
/*
dynamic_cast<>()的重要工作就是运行时识别RIIT

-------------------------------------------
旺旺
我是狗,我会看家
喵喵
我是猫,我会抓老鼠
请按任意键继续. . .


*/

猜你喜欢

转载自blog.csdn.net/baixiaolong1993/article/details/89490226