gpt4 book ai didi

c++ - 当您使用多重继承时,静态转换何时安全?

转载 作者:IT老高 更新时间:2023-10-28 23:13:52 27 4
gpt4 key购买 nike

我发现自己处于一种我知道某物是什么类型的情况。类型是三个(或更多)继承级别之一。我调用返回 B* 的工厂,但是 T 是类型的最高级别(如果我的代码知道它是什么)或第二级别。

无论如何,我在模板中做了一个 static_cast,这是错误的做法。我的问题是我什么时候可以安全地进行静态转换?有没有这样的时候?我在这种情况下这样做是因为当我不小心将 T 作为古怪的东西(已经发生并且)动态转换忽略(并返回 null)时,我宁愿得到编译错误。但是,当我知道正确的类型时,指针没有调整,导致我的指针不好。我不知道为什么在这种情况下允许静态转换。

什么时候可以安全地使用 static_cast 进行向下转换?有没有什么情况?现在似乎使用 static_cast 总是错误的(当目的是向下转换时)

好的,我想出了如何重现它。

#include <iostream>
struct B { virtual void f1(){} };
struct D1 : B {int a;};
struct D2 : B {int a, b; };
struct DD : D1, D2 {};

int main(){
void* cptr = new DD(); //i pass it through a C interface :(
B* a = (B*)cptr;
D2* b = static_cast<D2*>(a); //incorrect ptr
D2* c = dynamic_cast<D2*>(a); //correct ptr
std::cout << a << " " <<b << " " <<c;
}

最佳答案

交叉 Actor :

struct Base1 { virtual void f1(); };
struct Base2 { virtual void f2(); };
struct Derived : Base1, Base2 {};

Base1* b1 = new Derived();
Base2* b2 = dynamic_cast<Base2*>(b1);

需要使用 dynamic_cast,不能使用 static_cast 来完成(static_cast 应该会导致编译时错误)。如果任一基类不是多态的,dynamic_cast 也会失败(虚函数的存在不是可选的)。

this explanation on MSDN

关于c++ - 当您使用多重继承时,静态转换何时安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com