C++中的类型转换运算符dynamic_cast、static_cast、const_cast和reinterpret_cast详解

C++中的类型转换运算符

    • 零、小序
    • 一、dynamic_cast
      • 1、关于dynamic_cast
      • 2、代码示例
    • 二、static_cast
      • 1、关于static_cast
      • 2、代码示例
    • 三、const_cast
      • 1、关于const_cast
      • 2、代码示例
    • 四、reinterpret_cast
      • 1、关于reinterpret_cast
      • 2、代码示例
    • 五、总述

零、小序

C++程序员都知道,C语言中的强制转换和万能转换指针“void*”很常用,然而这样的转换有时候很不安全,甚至有时候是无意义的转换!C风格的强制转换和万能转换都需要程序员自己把握转换的安全性,出现错误的可能性很大。面对C风格的松散转换,C++增加了4个类型转换运算符,用于规范类型转换,程序员可以根据需要选择一个类型转换运算符,并让编译器去检查类型转换的安全性,提高代码的安全性和健壮性!

一、dynamic_cast

1、关于dynamic_cast

dynamic_cast运算符是C++程序员经常使用的转换类型,它也是最常用的RTTI(运行阶段类型识别)组件,是基于类的继承层次之间一种动态的转换,这就要求基类必须有虚函数才能和子类之间进行转换。

它既允许向上转换(子类转换为父类)、也允许向下转换(父类转换为子类)。只有指针类型与转换的对象类型(或者是对象的直接或间接的基类)相同时才一定是安全的。因此向上转换是安全的,而向下转换不一定安全。转换不成功时,指针会返回空值。

dynamic_cast也可以用于引用的转换,但是由于没有和空指针对应的引用值,当引用转换不正确时,会抛出异常。

2、代码示例

// DynamicCastType.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 

using namespace std;

class Grand
{
   
public:
	Grand() {
   }
	~Grand() {
   }

	virtual void printName()
	{
   
		cout << "I'm Grand!" << endl;
	}
private:

};

class Son : public Grand
{
   
public:
	Son() {
   }
	~Son() {
   }
	virtual void printName()
	{
   
		cout << "I'm Son!" << endl;
	}

	void sayName()
	{
   
		cout << "I'm Jack!" << endl;
	}

private:

};

class GrandSon : public Son
{
   
public:
	GrandSon() {
   }
	~GrandSon() {
   }
	virtual void printName()
	{
   
		cout << "I'm GrandSon!" << endl;
	}

	void sayAge()
	{
   
		cout << "My age is 18!" << endl;
	}
private:

};

#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}

int main()
{
   
	cout << "-----------------dynamic_cast类型转换------------------" << endl;
	Grand *pGrand = new Grand;
	Son *pSon = new Son;
	GrandSon *pGrandSon = new GrandSon;
	cout << "-----------------向上转换安全------------------" << endl;
	Grand *pTmpGrand1 = dynamic_cast<Grand*>(pSon); // 向上转换安全
	pTmp

你可能感兴趣的:(C++,c++,dynamic_cast,static_cast,const_cast,C++中的类型转换运算符)