C++隐式转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

首先回顾一下C++类型转换:

C++类型转换分为:隐式类型转换和显式类型转换

1

又称为“标准转换”,包括以下几种情况:

1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。

int ival = 3;

double dval = 3.14159;

ival + dval;//ival被提升为double类型

2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型

int *pi = 0; // 0被转化为int *类型

ival = dval; // double->int

例外:void指针赋值给其他指定类型指针时,不存在标准转换,编译出错

3)将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型

extern double sqrt(double);

cout << "The square root of 2 is " << sqrt(2) << endl;

//2被提升为double类型:2.0

4)从一个函数返回一个表达式,表达式类型与返回类型不一致:目标转换类型为函数的返回类型

double difference(int ival1, int ival2)

{

return ival1 - ival2;

//返回值被提升为double类型

}

第2部分. 显式类型转换

被称为“强制类型转换”(cast)

C 风格:(type-id)

C++风格:static_cast、dynamic_cast、reinterpret_cast、和const_cast..

public:

virtual int salary();

};

class Manager : public Employee

{

public:

int salary();

};

class Programmer : public Employee

{

public:

int salary();

};

我们公司在开发的时候建立有如下类:

class MyCompany

{

public:

void payroll(Employee *pe);

//

};

void MyCompany::payroll(Employee *pe)

{

//do something

}

但是开发到后期,我们希望能增加一个bonus()的成员函数到W$公司提供的类层次中。假设我们知道源代码的情况下,很简单,增加虚函数:

//Emplyee.h

class Employee

{

public:

virtual int salary();

virtual int bonus();

};

class Manager : public Employee

{

public:

int salary();

class Programmer : public Employee

{

public:

int salary();

int bonus();

};

//Emplyee.cpp

int Programmer::bonus()

{

//

}

payroll()通过多态来调用bonus()

class MyCompany

{

public:

void payroll(Employee *pe);

//

};

void MyCompany::payroll(Employee *pe)

{

//do something

//pe->bonus();

}

但是现在情况是,我们并不能修改源代码,怎么办?dynamic_cast华丽登场了!

在Employee.h中增加bonus()声明,在另一个地方定义此函数,修改调用函数payroll().重新编译,ok //Emplyee.h

class Employee

{

public:

virtual int salary();

};

class Manager : public Employee

{

public:

int salary();

};

class Programmer : public Employee

{

public:

int salary();

int bonus();//直接在这里扩展

};

//somewhere.cpp

int Programmer::bonus()

{

//define

}

class MyCompany

{

public:

void payroll(Employee *pe);

//

};

void MyCompany::payroll(Employee *pe)

{

Programmer *pm = dynamic_cast(pe);

//如果pe实际指向一个Programmer对象,dynamic_cast成功,并且开始指向Programmer对象起始处if(pm)

{

//call Programmer::bonus()

}

//如果pe不是实际指向Programmer对象,dynamic_cast失败,并且pm = 0

else

{

//use Employee member functions

}

}

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

相关文档
最新文档