第三十九节 C++ 类型转换运算符 static_cast, dynamic_cast, reinterpret_cast, const_cast

原创 2018年04月16日 19:03:53
C++类型转换运算符:static_cast, dynamic_cast, reinterpret_cast, const_cast

使用格式: dest_type result = cast_type<dest_type> (objest_to_be_casted)

static_cast:  用途1: 在继承中,在编译阶段检查转换类型是否相关,若不相关,编译失败,可用于继承类的向上转换
                   用途2: 显示提醒程序员,这里进行了类型转换, int num = static_cast<int>(value);

dynamic_cast: 在运行阶段,检查转换类型是否相关,用于继承类的向下转换,可检测使用基类参数的对象,是否为此基类的派生类,若不是,返回NULL,用dynamic_cast时一定要检查返回的地址是否为NULL

reinterpret_cast: 强制类型转换

const_cast: 去除const限制

#include <iostream>
using namespace std;

class  Base {
public:
	/*实现多态*/
	virtual void getVesion() {
		cout << "The Base class getVesion()" << endl;
	}

	Base() { cout << "Base() constructor" << endl; }

	/*防止仅释放基类*/
	virtual	~Base() { cout << "~Base() deconstructor" << endl; }

};

class Derived : public Base {
public:
	void getVesion() {
		cout << "The Derived getVesion()" << endl;
	}

	Derived() {
		cout << "Detived() constrctor" << endl;
	}

	~Derived() { 
		cout << "~Detived() deconstrctor" << endl; 
		delete this;
	}
};

class Derived2 : public Base {
public:
	void getVesion() {
		cout << "The Derived2 getVesion()" << endl;
	}

	Derived2() {
		cout << "Detived2() constrctor" << endl;
	}

	~Derived2() {
		cout << "~Detived2() deconstrctor" << endl;
		delete this;
	}
};


class NotDerived {
public:
	void getVesion() {
		cout << "The NotDerived getVesion()" << endl;
	}

	NotDerived() {
		cout << "NotDerived() constrctor" << endl;
	}

	~NotDerived() {
		cout << "~NotDerived() deconstrctor" << endl;
		delete this;
	}
};

void VerifyObject(Base* input) {
	/*dynamic_cast检查两者是否有关系,即检查传入的是不是Derived对象,
	若是返回一个指针,若不是返回NULL*/
	if (dynamic_cast<Derived *> (input))  //向下转换,基类转派生类,安全的转换
		cout << "Is Derived" << endl;
	else
		cout << "Not Derived" << endl;
}

int main()
{
	Derived* isDerived = new Derived;
	Derived2* isDerived2 = new Derived2;
	NotDerived* notDetived = new NotDerived;
	
	cout << "---- static_cast ----" << endl;
	/*向上转换,可以使用static_cast,仅在编译阶段起作用,如下。*/
	Base* base = static_cast<Base*> (isDerived); //编译通过,类型相关,继承关系
	//Base* base = static_cast<Base*> (notDetived); //编译错误,类型不相关,不存在继承关系

	/*但是使用static_cast向下转换是不安全的转换,因为基类转成派生类对象,而派生类对象的某些方法可以没有实现,
	导致调用错误,但是由于存在继承关系使用static_cast进行向下转换可以编译通过的,但在运行阶段出问题。
	所以最好不要使用其进行向下转换
	*/

	cout << "---- dynamic_cast ----" << endl;
	VerifyObject(isDerived);
	VerifyObject(isDerived2);

	return 0;
}

output:

Base() constructor
Detived() constrctor
Base() constructor
Detived2() constrctor
NotDerived() constrctor
---- static_cast ----
---- dynamic_cast ----
Is Derived
Not Derived

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dddd0216/article/details/79964778

C语言系列之 字符串、类型转换与运算符

清华大学尹成老师、微软全球最具价值专家,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!
  • 2015年06月23日 15:22

static_cast,const_cast,dynamic_cast, reinterpret_cast四种类型转换区别

一 C风格显式转换和函数风格式转换     在C++中有些数据类型的转换是可以直接转换的,这种称为隐式转换。例如: double a = 12.0; int b = a;但有时编译器对于一些数据精度...
  • hhhhh2333
  • hhhhh2333
  • 2016-11-19 01:55:01
  • 477

C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast

类型转换是一种让程序员能够暂时或永久性改变编译器对对象的解释机制。可改变对象解释方式的运算符称为类型转换运算符。 为何需要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块能够相互调用和协作...
  • LG1259156776
  • LG1259156776
  • 2015-07-22 15:55:45
  • 1155

C++中的类型转换

  • 2015年07月23日 15:47
  • 44KB
  • 下载

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
  • fengbingchun
  • fengbingchun
  • 2016-04-24 20:36:05
  • 10740

【c++强制类型转换】:dynamic_cast、const_cast 、static_cast、reinterpret_cast

zongs dynamic_cast:   通常在基类和派生类之间转换时使用,run-time   cast const_cast:   主要针对const和volatile的转换.  static...
  • panda1234lee
  • panda1234lee
  • 2014-04-22 17:39:19
  • 1024

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

以下文章转载自 :  http://www.cnblogs.com/chenyangchun/p/6795923.html如有侵权,请联系删除,谢谢1. c强制转换与c++强制转换 c语言强制类型转换...
  • dyingfair
  • dyingfair
  • 2018-02-26 23:26:28
  • 26

static_cast、dynamic_cast、reinterpret_cast和const_cast

  • 2016年07月18日 12:47
  • 1007KB
  • 下载

xxx_cast类型转换static_cast/const_cast/reinterpret_cast/dynamic_cast

#include #include using namespace std; class Base { public: // void show() const virtual void s...
  • earbao
  • earbao
  • 2017-02-13 12:04:59
  • 314

标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

  • 2011年02月18日 17:30
  • 176KB
  • 下载
收藏助手
不良信息举报
您举报文章:第三十九节 C++ 类型转换运算符 static_cast, dynamic_cast, reinterpret_cast, const_cast
举报原因:
原因补充:

(最多只允许输入30个字)