静态转换指向指针的指针 C++ [重复]

Static casting a pointer to a pointer C++ [duplicate]

提问人:kabla002 提问时间:11/10/2023 更新时间:11/10/2023 访问量:103

问:

有人会帮我理解为什么第二次静态投射失败吗?第一个静态转换很好地检查以确保 Der 与 Base 相关。为什么第二个static_cast会导致编译器抛出以下错误。谢谢!auto cpp = static_cast<Base **>(bpp);

main.cpp:35:17: error: invalid ‘static_cast’ from type ‘Der**’ to type ‘Base**’

#include <stdio.h>

class Base
{
};

class Der : public Base 
{
};

int main()
{
 
    Base a;
    Der b;
    
    Base * ap = &a;
    Der * bp = &b;
    
    auto cp = static_cast<Base *>(bp);
    
    Base ** app = &ap;
    Der ** bpp = &bp;

    auto cpp = reinterpret_cast<Base **>(bpp);
    //auto cpp = static_cast<Base **>(bpp); // Why does the cause an error?

    printf("Hello World");

    return 0;
}

C++ 指针 静态强制转换

评论

4赞 Ulrich Eckhardt 11/10/2023
这将允许将 分配给该指针的目标,从而破坏类型安全性。OtherDerived*
0赞 Patrick Roberts 11/10/2023
不确定标准中具体是什么防止了这一点,但我怀疑在特定情况下,这种类型的转换可能会导致混淆行为或错误。从派生类转换为基类可能需要调整指针,以考虑类布局中辅助基类的偏移量,但如果指向该地址,则该地址的值无法通过 .我认为完全禁止这种类型的转换比有选择地允许不需要指针调整的转换更简单。static_cast
3赞 Some programmer dude 11/10/2023
虽然 a 可以转换为 a(因为继承是“是”关系,所以是 ),但与 完全不同。添加更多间接内容后,“is a”关系将不再适用。Der*Base*DerBaseDer**Base**

答: 暂无答案