首页 > 试题广场 >

有如下代码: struct A1{ virtual

[单选题]
有如下代码:
struct A1{
    virtual ~A1(){}
};
struct A2{
    virtual ~A2(){}
};
struct B1 : A1, A2{};
int main()
{
 B1 d;
 A1* pb1 = &d;
 A2* pb2 = dynamic_cast<A2*>(pb1);  //L1
 A2* pb22 = static_cast<A2*>(pb1);  //L2
 return 0;
}
下面说法正确的是()
  • L1语句编译失败,L2语句编译通过
  • L1语句编译通过,L2语句编译失败
  • L1,L2都编译失败
  • L1,L2都编译通过
1. static_cast关键字(编译时类型检查)
直接检查表达式括号里面的类型 pb1 是A1* 类型,不能转A2
(1)没有虚函数同样可以编译通过;
(2)用于非多态类型转换(静态转换),任何标准转换都可以用它,最常用的类型转换符,用于基本数据类型之间的转换,如把int转换为char,但是不能用于两个不相关的类型转换。
(3)用于类层次结构中基类和派生类之间指针或引用的转换,                             
    上行转换(派生类---基类)是安全的,与dynamic_cast效果相同;    
    下行转换(基类---派生类)由于没有动态类型检查,所以是不安全的;   
(4) 把空指针转换成目标类型的空指针                
(5) 把任何类型的表达式转为void类型           
(6) static_cast不能转换掉expression的const、volatile、或者__unaligned属性
2. dynamic_cast关键字(运行时类型检查)
检查表达式指针指向的对象类型。pb1 是 B1 类型,可以转 A2
(1)dynamic_cast只能用于有虚函数的类(必须有共有继承和虚函数),为运行时转换,由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的;如果父类没有虚函数,编译报错
(2)用于类层次结构中基类和派生类之间指针或引用的转换, 
        上行转换(派生类--->基类)是安全的,与static_cast效果相同;
        下行转换(基类--->派生类)具有类型检查的功能,转型是安全的,
        当类型不一致时,转换过来的是空指针;
(3)先检查能否转型成功,能成功则转型,不能成功则返回0  
发表于 2021-11-30 23:33:07 回复(0)
按照热评的说法 static直接检查表达式括号里的类型 dynamic检查对象
发表于 2022-03-17 13:31:09 回复(0)
<p>dynamic-cast&lt;T*&gt;(地址a)如果类型T不是a的某个基类型,该操作将返回一个空指针</p>
发表于 2020-09-03 10:42:47 回复(0)

static_cast

static_cast 主要用于非多态类型之间的转换,包括浮点数和整型之间的转换,以及父类指针向子类指针的转换(需要程序员保证安全性)。具体用法如下:

cppCopy Code
// 非多态类型之间的转换 int i = 10; double d = static_cast<double>(i); // 父类指针向子类指针的转换 class Base {}; class Derived : public Base {}; Base* basePtr = new Derived(); Derived* derivedPtr = static_cast<Derived*>(basePtr);

在使用 static_cast 进行父类指针向子类指针的转换时,需要注意程序员自己保证转换的安全性,因为 static_cast 不会进行运行时的类型检查。

dynamic_cast

dynamic_cast 主要用于多态类型之间的转换,即含有虚函数的类之间的转换,它会在运行时进行类型检查。具体用法如下:

cppCopy Code
class Base { public: virtual ~Base() {} }; class Derived : public Base {}; Base* basePtr = new Derived(); Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); if (derivedPtr) { // 转换成功 } else { // 转换失败 }

在使用 dynamic_cast 进行父类指针向子类指针的转换时,如果转换合***返回转换后的指针;如果转换不合法,则返回空指针。需要注意的是,使用 dynamic_cast 进行类型转换时,基类必须至少包含一个虚函数,否则编译器会报错。

总结来说,static_cast 主要用于静态类型转换,而 dynamic_cast 用于动态类型转换,并且在多态类型之间的转换上具有更多的安全性。

发表于 2023-11-17 09:04:31 回复(0)