21.四种类型转换方式

Posted 为了财务自由!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21.四种类型转换方式相关的知识,希望对你有一定的参考价值。

C++语言级别的四种类型转换方式:

const_cast
去掉常量属性的一个类型转换!
<>里面必须是个指针或者引用!!!

汇编层面是一样子的!

static_cast
提供编译器认为安全的类型转换!
没有任何联系的类型之间的转换就会被否定!!

reinterpret_cast
类似于C风格的强制类型转换!

dynamic_cast
主要用于继承结构中,可以支持RTTI类型识别的上下转换!

class Base

public:
	virtual void func() = 0;
;
class Derive1 : public Base

public:
	void func()  cout << "call Derive1::func" << endl; 
;
class Derive2 : public Base

public:
	void func()  cout << "call Derive2::func" << endl; 
	// Derive2实现新功能的API接口函数
	void derive02func() 
	 
		cout << "call Derive2::derive02func" << endl; 
	
;
/*
typeid(*p).name() == "Derive"
*/
void showFunc(Base *p)

	// dynamic_cast会检查p指针是否指向的是一个Derive2类型的对象?
	// p->vfptr->vftable RTTI信息 如果是,dynamic_cast转换类型成功,
	// 返回Derive2对象的地址,给pd2;否则返回nullptr
	// static_cast编译时期的类型转换  dynamic_cast运行时期的类型转换 支持RTTI信息识别
	Derive2 *pd2 = dynamic_cast<Derive2*>(p);
	if (pd2 != nullptr)
	
		pd2->derive02func();
	
	else
	
		p->func(); // 动态绑定  *p的类型 Derive2  derive02func
	

int main()

	Derive1 d1;
	Derive2 d2;
	showFunc(&d1);
	showFunc(&d2);

	//static_cast 基类类型 《=》 派生类类型  能不能用static_cast?当然可以!
	//int *p = nullptr;
	//double* b = reinterpret_cast<double*>(p);

	//const int a = 10;
	//int *p1 = (int*)&a;
	//int *p2 = const_cast<int*>(&a);
	// const_cast<这里面必须是指针或者引用类型 int* int&>
	//int b = const_cast<int>(a);
	return 0;

以上是关于21.四种类型转换方式的主要内容,如果未能解决你的问题,请参考以下文章

简述C#中类型转换的方式

C++中的四种类型转换运算符static_castdynamic_castconst_cast和reinterpret_cast的使用

C++C++的四种类型转换

c++的四种强制类型转换

比较C++中的4种类型转换方式

C++ 的四种类型转换