代码之家  ›  专栏  ›  技术社区  ›  Koban

在C中使用不正确的downcast访问基类成员++

  •  2
  • Koban  · 技术社区  · 7 年前

    下面的C++代码正确吗?

    struct Base { int x; };
    struct Derived : Base { int y; }
    Base * b = new Base;
    Derived * d = static_cast<Derived *>(b);
    //below we access only d->x, but not d->y
    std::cout << d->x;
    

    如果没有,到底出了什么问题?C++标准对此怎么说?至少我没见过它坠毁过。

    1 回复  |  直到 7 年前
        1
  •  11
  •   chris    7 年前

    这在中相当简单 [expr.static.cast]/11 (我的重点):

    指向cv1 B的指针类型prvalue(其中B是类类型)可以转换为指向cv2 D的指针类型prvalue,其中D是从B派生的类 ,如果cv2与cv1相同或大于cv1。如果B是D的虚拟基类或D的虚拟基类的基类,或者如果不存在从指向D的指针到指向B的指针的有效标准转换([conv.ptr]),则程序的格式不正确。空指针值转换为目标类型的空指针值。

    你没有一个 Derived