gpt4 book ai didi

c++ - reinterpret_cast 和交叉类型转换

转载 作者:行者123 更新时间:2023-11-30 00:36:25 25 4
gpt4 key购买 nike

#include<iostream>

struct I1
{
virtual void nb1()=0;
virtual ~I1(){}
};

struct I2
{
virtual void nb2()=0;
virtual void nb22()=0;
virtual ~I2(){}
};

struct C12 : I1, I2
{
virtual void nb1(){std::cout << "nb\n";}
virtual void nb2(){std::cout << "nb2\n";}
virtual void nb22(){std::cout << "nb22\n";}
};

int main()
{
I2 * p2 = new C12;
I1 * p1 = reinterpret_cast<I1*>(p2);
return 1;
}

在这里使用 reinterpret_cast 有什么禁忌症吗?我应该强制使用 dynamic_cast 吗?

只有 I1 和 I2 是纯虚拟的才可以吗?

最佳答案

reinterpret_cast 不安全;你应该总是使用dynamic_castI1I2 是纯虚类是无关紧要的;作为 C12 的子对象,它们具有非零存储要求。事实上,在下面的程序中:

int main() {
I2 * p2 = new C12;
I1 * p1 = reinterpret_cast<I1*>(p2);
std::cout << p2 << '\n';
std::cout << p1 << '\n';
std::cout << dynamic_cast<I1*>(p2) << '\n';
p1->nb1();
}

输出是:

0x14de0c8
0x14de0c8
0x14de0c0 // !!!
nb2 // !!!

您可能会想到 empty base optimization (1.8p5);但这不适用于具有虚拟方法的类,它需要一个 vptr。

关于c++ - reinterpret_cast 和交叉类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036224/

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