首页 > 试题广场 >

在C++,下列哪一个可以做为对象继承之间的转换()

[单选题]
在C++,下列哪一个可以做为对象继承之间的转换()
  • static_cast
  • reinterpret_cast
  • dynamic_cast
  • const_cast
reinterpret_cast:一个指针转化为其他类型的指针时,不做类型检测,操作结果是一个指针指向另一个指针的值的二进制拷贝;
static_cast:允许执行隐式转换和相反的转换操作,父类转换为子类是强制转换Son *son=static_cast(father),而子类转换为父类就是隐式转换;
dynamic_cast:用于对象的指针和引用,当用于多态类型转换时,允许隐式转换及相反的过程中,与static_cast的不同之处在于,在相反的转换过程中,dynamic_cast会检测操作的有效性,如果返回的不是被 请求的 有效完整对象,则返回null,反之返回这个有效的对象,如果是引用返回无效时则会抛出bad_cast异常;
const_cast:这个转换操作会操纵传递对象的const属性,或者设置或者移除该属性。
发表于 2015-09-29 10:59:58 回复(2)
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 
       即会作一定的判断。 
       对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 
       对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。
发表于 2015-09-20 09:09:34 回复(0)
有个疑问,dynamic_cast 与static_cast 这道题有什么区别呢?
看这个,好像感觉都可以用?!
求大神解答
发表于 2016-08-30 11:19:55 回复(3)

答案:A、C。

 转换指的是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。

C++标准定义了四个新的转换符:reinterpret_cast、static_cast、dynamic_cast和const_cast,

目的在于控制类(class)之间的类型转换。

 

对于选项A,static_cast可以用于类层次结构中基类和子类之间指针或引用的转换。

把子类的指针或引用转换成基类表示是安全的,但把基类指针或引用转换成子类指针或引用时,由于没有动态类型检查,所以,它是不安全的。

基类和子类之间的动态类型转换一般建议使用dynamic_cast。

static_cast可以用作对象继承之间转换,只不过有安全隐患。因此,选项A正确。

 

对于选项B,reinterpret_cast用来处理无关类型之间的转换,可以转换任意一个32位整数,

包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,

以及把指针转化为任意类型的指针,但不能将非32位的实例转成指针。所以,选项B错误。

     

 对于选项C,dynamic_cast用于对象的指针和引用,当用于多态类型转换时,

允许隐式转换及相反的转换操作,与static_cast的不同之处在于,在相反的转换过程中,

dynamic_cast会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回null,

反之返回这个有效的对象,如果是引用返回无效时,则会抛出bad_cast异常。所以,选项C正确。

 

对于选项D,const_cast用来修改类型的const或volatile属性,具体而言,

const_cast会操纵传递对象的const属性,设置或者移除该属性。所以,选项D错误。

 

所以,本题的答案为A、C。


发表于 2018-07-13 17:13:31 回复(0)
一个命名的强制类型转换具有如下形式:
cast-name<type>(expression)
cast-name指明了进行哪种类型的转换
static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。常用于将较大类型转换为较小类型,强制类型转换告诉程序的读者和编译器不在乎精度的损失;也可以用于编译器无法自动执行的类型转换:
void *p = &d; double *dp = static_cast<double*>(p); 
const_cast:只能改变运算对象的底层const:
const char *pc; char *p=const_cast<char*>(pc);
reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释:
int *ip;
char *pc = reinterpret_cast<char*>(ip);
dynamic_cast用于将基类的指针或引用安全地转换为派生类的指针或引用
发表于 2017-05-14 21:58:08 回复(0)
dymanic_cast支持动态的类型转换,支持运行时识别指针或引用所指向的对象
const_cast转换掉表达式的const性质
reinterpret_cast旧式的强制转换
发表于 2016-08-15 15:09:47 回复(0)

《c++ primer》114-类型转换:

发表于 2019-07-03 22:10:00 回复(0)
转换运算函数
发表于 2018-08-26 23:12:16 回复(0)
reinterpret_cast:一个指针转化为其他类型的指针时,不做类型检测,操作结果是一个指针指向另一个指针的值的二进制拷贝;
static_cast:允许执行隐式转换和相反的转换操作,父类转换为子类是强制转换Son *son=static_cast(father),而子类转换为父类就是隐式转换;
dynamic_cast:用于对象的指针和引用,当用于多态类型转换时,允许隐式转换及相反的过程中,与static_cast的不同之处在于,在相反的转换过程中,dynamic_cast会检测操作的有效性,如果返回的不是被 请求的 有效完整对象,则返回null,反之返回这个有效的对象,如果是引用返回无效时则会抛出bad_cast异常;
const_cast:这个转换操作会操纵传递对象的const属性,或者设置或者移除该属性。
发表于 2018-08-14 10:41:31 回复(0)
reinterpret_cast:一个指针转换为其他类型指针时,不做类型检测,操作结果是一个指针指向另一个指针的值的二进制拷贝;
static_cast:允许执行隐式转换和相反的转换操作,父类转换为子类是强制转换Son *son=static_cast(father) ,而子类转换为父类就是隐式转换;
dynamic_cast:用于对象的指针和引用,当用于多态类型的转换时,允许隐式转换和相反过程,不过于static_cast的不同之处在于,在相反的转换过程中(父类转换为子类),会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回Null,反之返回这个有效的对象,如果引用返回无效时则会跑出bad_cast异常;
const_cast:这个操作会操纵传递对象的const属性,或者设置或者移除该属性;
发表于 2018-07-21 14:30:22 回复(0)

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

C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast

为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

四种转换的区别:

static_cast:可以实现C++中内置基本数据类型之间的相互转换。

int c=static_cast(7.987);

如果涉及到类的话,static_cast只能在具有相互联系的类中进行转换,不一定包含虚函数。

class A

{};

class B:public A

{};

class C

{};

int main()

{

A* a=new A;

B* b;

C* c;

b=static_cast(a); // 编译不会报错, B类继承A类

c=static_cast(a); // 编译报错, C类与A类没有任何关系

return 1;

}

const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。

dynamic_cast:

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

发表于 2018-03-29 21:07:24 回复(0)
static也没问题,并且A只要有继承关系任何情况都可以转换,而dynamic需要在目标对象有虚函数(多态)时才能转换,同时转换过程中会判断能否转换成功。 所以此题应选static,如果题意为最好用什么转换,则选dynamic。
发表于 2017-09-21 00:56:35 回复(0)
dymanic_cast支持动态的类型转换,支持运行时识别指针或引用所指向的对象 const_cast转换掉表达式的const性质 reinterpret_cast旧式的强制转换
发表于 2017-09-04 19:59:49 回复(0)
运行时类型识别dynamic_cast

发表于 2017-09-03 23:54:16 回复(0)