c – 当您使用多重继承时静态转换是否安全?

c – 当您使用多重继承时静态转换是否安全?,第1张

概述我发现自己处于一种我知道什么类型的东西的情况. Type是三个(或更多)继承级别之一.我叫工厂返回B *但是T是一个类型的最高级别(如果我的代码知道它是什么)或第二级别. 无论如何,我在模板中做了一个static_cast是不对的.我的问题是我什么时候可以安全地静态施放?有没有这样的时间?我在这种情况下做到了,因为当我意外地将T作为古怪的东西(已经发生并且)动态转换忽略(并返回null)时,我宁愿 我发现自己处于一种我知道什么类型的东西的情况. Type是三个(或更多)继承级别之一.我叫工厂返回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 ptrD2* c = dynamic_cast<D2*>(a); //correct ptrstd::cout << a << " " <<b << " " <<c;}
解决方法 交叉投射:
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 – 当您使用多重继承时静态转换是否安全?全部内容,希望文章能够帮你解决c – 当您使用多重继承时静态转换是否安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1241834.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存