gpt4 book ai didi

c++ - 将 reinterpret_cast 的派生类指针转换为基类指针未定义行为吗?

转载 作者:可可西里 更新时间:2023-11-01 15:23:50 25 4
gpt4 key购买 nike

看一个简单的例子:

struct Base { /* some virtual functions here */ };
struct A: Base { /* members, overridden virtual functions */ };
struct B: Base { /* members, overridden virtual functions */ };

void fn() {
A a;
Base *base = &a;
B *b = reinterpret_cast<B *>(base);
Base *x = b;
// use x here, call virtual functions on it
}

这个小片段是否有未定义的行为?

reinterpret_cast定义良好,它返回base不变的值,只是B *的类型。

但我不确定 Base *x = b; 行。它使用b,它的类型是B *,但它实际上指向一个A对象。而且我不确定 x 是否是“正确的”Base 指针,是否可以用它调用虚函数。

最佳答案

static_cast(或隐式派生指针到基指针的转换,其作用完全相同)与 reinterpret_cast 有很大不同。不能保证基本子对象的起始地址与完整对象的地址相同。

大多数实现将第一个 基础子对象放置在与完整对象相同的地址,但当然即使这样的实现也不能将两个 不同的非空基础子对象放置在同一个地址。 (具有虚函数的对象不为空)。当基本子对象与完整对象不在同一地址时,static_cast 不是空操作,它涉及指针调整。

有些实现永远不会将第一个基本子对象放在与完整对象相同的地址。例如,允许将基础子对象放在派生的所有成员之后。 IIRC Sun C++ 编译器曾经以这种方式布局类(不知道它是否仍在这样做)。在这样的实现中,这段代码几乎肯定会失败。

具有多个基数的 B 的类似代码在许多实现中都将失败。 Example .

关于c++ - 将 reinterpret_cast 的派生类指针转换为基类指针未定义行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55531480/

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