1、const_cast 去常性(常量指向非常量指针) const int* -------------> int*
2、static_cast 安全性高
3、reinterpret_cast (void*)类似于C语言的转换
4、dynamic_cast 运行时类型转换
#include<iostream>
#include<string>
using namespace std;
//拥有纯虚函数的类称为抽象类
class Animal
{
public:
Animal(string name) :mname(name){}
//设置纯虚接口,预留接口,但未实现
virtual void bark() = 0;
protected:
string mname;
};
//派生类要是不实现接口,那么也就是抽象类了
class Dog :public Animal
{
public:
Dog(string name) :Animal(name){}
void bark()
{
cout << mname << ":wang wang wang" << endl;
}
};
class Cat :public Animal
{
public:
Cat(string name) :Animal(name){}
void bark()
{
cout << mname << ":miao miao miao" << endl;
}
};
class Tortoise :public Animal
{
public:
Tortoise(string name) : Animal(name){}
void bark(){}
};
//乌龟不会叫,在showBark中提取Animal对象的内存,不是乌龟,调用bark(),是乌龟,打印不会叫
void showBark(Animal& animal)
{
if (typeid(animal) == typeid(Tortoise))
{
cout << "Tortoise can't bark" << endl;
}
animal.bark();
}
int main()
{
Dog dog("dog");
Cat cat("cat");
Tortoise tor("Tortoise");
showBark(dog);
showBark(cat);
showBark(tor);
return 0;
}
运性结果:
使用类型强转实现通用的showBark函数
void showBark1(Animal* animal)
{
Tortoise* temtor = dynamic_cast<Tortoise*>(animal);
//如何转换?
//从animal所指的对象中提取RTTI信息,如果和Tortoise*类型相同,
//则转换成功,temtor就有值了,否则temtor就指空了。
if (temtor != NULL)
{
cout << "Tortoise can't bark" << endl;
}
animal->bark();
}
int main()
{
Dog dog("dog");
Cat cat("cat");
Tortoise tor("Tortoise");
showBark(dog);
showBark(cat);
showBark(tor);
return 0;
}
运行结果:
Tortoise* temtor = dynamic_cast<Tortoise*>(animal);
实参为基类指针animal 指向派生类对象
vfptr---->vftable------->RTTI--------->和模板类型信息(<Tortoise*>)进行比较