gpt4 book ai didi

c++ - 将基础实例指针转换为派生实例指针是否合法? (该实例不是派生实例)

转载 作者:行者123 更新时间:2023-12-01 15:11:10 24 4
gpt4 key购买 nike

我想从类本身之外以无限制的方式(为什么?宏魔术)访问Base类成员。该策略是在Derived类中执行此操作,并将指向Base的指针转换为指向Derived的指针(即使实例不是Derived)。

根据我的尝试,代码可以正确编译并正常运行:这是标准的还是偶然的(标准是UB)的coliru link

#include<iostream>

struct Base{
int a=3;
};

struct Derived: public Base{
int getA(){
// this scope has unqualified access to Base class members
return a;
}
};

int main(void){
Base b;
std::cerr<<((Derived*)(&b))->getA()<<std::endl;
}

最佳答案

如果(Derived*)(&b)指向的对象实际上不是static_cast<Derived*>(&b)对象的子对象,则强制转换的&b等效于Derived,后者具有未定义的行为。请参阅当前C++标准草案的[static.cast]/11(至少从C++ 11开始存在等效语言)。

因此,您的程序具有未定义的行为,因为根本没有创建任何Derived对象,并且b不是Derived对象的子对象。

请注意,cppreference page on static_cast 在声明强制转换本身具有未定义的行为时并没有明确说明,但如上所述。

关于c++ - 将基础实例指针转换为派生实例指针是否合法? (该实例不是派生实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59333078/

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