[C/C++]_[使用dynamic_cast 强制转换的优点]

场景:

1. C++引入了dynamic_cast 这种类型识别的强制转换,对识别错误的程序是有好处的,建议能用的地方就用,它能在转换错误时返回0或抛出异常,比起C的旧强制转换

执行转换了不对类型依旧不会报错可靠些,因为这类错误如果发生了,其实很难找出来。

好处:

1.用在多态的子类情况下,父类不能提供处理接口,这时可以针对子类做特殊的处理。

2.dynamic_cast比另外3个cast优势就是会对转换进行检查,如果出错,会报错。

补充一个知识点: 左值和右值 (摘录自C++ Primer 3rd)

// 变量和文字常量都有存储区并且有相关的类型,区别在于变量是可寻址的 addressable

// 对于每一个变量都有两个值与其相关联.

// 1.它的数据值存储在某个内存地址中有时这个值也被称为对象的右值rvalue

// 读做 are-value我们也可认为右值的意思是被读取的值read value,文字常量和变量都可被用作右值.

// 2.它的地址值——即存储数据值的那块内存的地址它有时被称为变量的左值lvalue 读作 ell-value

// 我们也可认为左值的意思是位置值location value,文字常量不能被用作左值.

#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <iostream>
#include <string>
#include <vector>
#include <typeinfo>

using namespace std;

class Bill
{
public:

	virtual int GetBillNo()
	{
		return 0;
	}

	virtual time_t GetCreateDate()
	{
		time_t t;
		time(&t);
		return t;
	}

	virtual string GetBillName()
	{
		return string("Unknown.");
	}
};

class DebtBill : public Bill
{
public:
	virtual int GetBillNo()
	{
		return (int)this;
	}

	double GetDebtAmountDollar()
	{
		return  (int)this + 4.4;
	}

	virtual string GetBillName()
	{
		return string("DebtBill.");
	}
};

class OrderBill : public Bill
{
public:
	virtual int GetBillNo()
	{
		return (int)this;
	}

	virtual string GetBillName()
	{
		return string("OrderBill.");
	}
};

int main(int argc, char const *argv[])
{
	std::vector<Bill*> v;
	v.push_back(new DebtBill());
	v.push_back(new OrderBill());
	v.push_back(new OrderBill());
	v.push_back(new DebtBill());
	v.push_back(new OrderBill());

	for (size_t i = 0; i < v.size(); ++i)
	{
		Bill* bill = v[i];
		Bill& b2 = *bill;
		cout << "BillNo: " << bill->GetBillNo()
		     << " BillName: " << bill->GetBillName() << endl;
		if (DebtBill* db = dynamic_cast<DebtBill*>(bill))
		{
			cout << "GetDebtAmountDollar: " << db->GetDebtAmountDollar() << endl;
		}
		//如果是左值,那么可以转换为类引用,如果出错会抛出异常.
		try
		{
			DebtBill& db2 = dynamic_cast<DebtBill&>(b2);
			cout << "GetDebtAmountDollar2: " << db2.GetDebtAmountDollar() << endl;
		}catch(std::bad_cast)
		{
			cout << "cast fail:" << endl;
		}
	}

	return 0;
}

输出:

BillNo: 3870632 BillName: DebtBill.
GetDebtAmountDollar: 3.87064e+006
GetDebtAmountDollar2: 3.87064e+006
BillNo: 3870680 BillName: OrderBill.
cast fail:
BillNo: 3870664 BillName: OrderBill.
cast fail:
BillNo: 3870696 BillName: DebtBill.
GetDebtAmountDollar: 3.8707e+006
GetDebtAmountDollar2: 3.8707e+006
BillNo: 3870736 BillName: OrderBill.
cast fail:

[C/C++]_[使用dynamic_cast 强制转换的优点],布布扣,bubuko.com

时间: 2024-08-07 20:58:34

[C/C++]_[使用dynamic_cast 强制转换的优点]的相关文章

c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用.其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用:在方法中定义一个static变量,该变量在程序开始存在直到程序结束:类中定义一个static成员,该成员随类

总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)

做个笔记:源自论坛:http://bbs.csdn.net/topics/210039564 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast) C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast express

C++ 四种强制转换符的区别

作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别.除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象.而dynamic_cast则不然.在这里,不再讨论其他三种转换和C风格的转换. 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查. 先看RTTI

mfc 类型间的强制转换

一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换. 进行上行转换(把子类的指针或引用转换成基类表示)是安全的: ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保证. ③把空指针转换成目标类型的

C++类型强制转换&lt;转&gt;

转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类型转换.如子

C的强制转换和C++的强制转换(转)

C的强制转换: (type)<expression> 其中,type为类型描述符,如int,float等.<expression>为表达式.经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如: int nVar=0xab65; char cChar=char (nVar); 上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类

c++中的强制转换

一.C语言的强制转换1.1 隐性转换 不同数据类型之间赋值和运算,函数调用传递参数等等,由编译器完成        int        nTmp = 10;        short    sTmp = nTmp; //这个时候就需要注意转换时数据是否溢出(大字节转小字节)1.2 显性转换 在变量的前面加上(Type)进行显性转换,如:        class Test;        Test *test;        T* obj = (T*)test;//将对象强制转换成T二.C++

C++ 之 强制转换

C语言当中的强制转换基本没有任何的限制,只需要一个括号即可,而在C++中,对强制转换有了一定的限制,这样避免了我们在使用时造成的不明确问题,同时也增加了代码的可读性.一共有四种,分别时static_cast.reinterpret_cast.const_cast.dynamic_cast. 1.static_cast转换 可以实现相同类型之间的转换,如:double b ;int  a = static_cast<int>(b); 2.reinterpreter_cast 转换 可以实现不同类

访问一个绝对地址把一个整型数强制转换 (typecast)为一个指针是合法的

在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器.写代码去完成这一任务. 解析:这一问题测试你是否知道为了访问一个绝对地址把一个整型数强制转换(typecast)为一个指针是合法的.这一问题的实现方式随着个人风格不同而不同.典型的代码如下: 一个较晦涩的方法是: 建议你在面试时使用第一种方案.答案: