C++的四种类型强转

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*>)进行比较 

猜你喜欢

转载自blog.csdn.net/Aspiration_1314/article/details/86547348