//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
-------------------------------------------
旺旺
我是狗,我会看家
喵喵
我是猫,我会抓老鼠
请按任意键继续. . .
*/
002c++中的强制类型转换dynamic
猜你喜欢
转载自blog.csdn.net/baixiaolong1993/article/details/89490226
今日推荐
周排行