首页 > 解决方案 > 派生类返回分配的基类实例

问题描述

以下在 C++ 中是否合法?派生类正在分配基类并将其转换为派生类。显然,如果派生(C)有成员,任何通过返回的指针访问成员的人都会失败。但即使没有派生成员 - 这是合法的吗?UB?

struct B { int a; };
struct C : B { 
   static C* get() {
       return static_cast<C*>(new B);
   }
   enum { X, Y,};
};
int main(){
   C* c = C::get();
   return c->X;
}

标签: c++inheritancelanguage-lawyerstatic-cast

解决方案


是UB。标准摘录(强调我的):

8.2.9 静态投射 - 项目符号 11

“pointer to cv1 B”类型的纯右值,其中 B 是类类型,可以转换为“指向 cv2 D”类型的纯右值,其中 D 是从 B 派生的类,如果 cv2 是相同的 cv-qualification作为或比 cv1 更高的 cv 限定。如果 B 是 D 的虚拟基类或 D 的虚拟基类的基类,或者如果不存在从“指向 D”到“指向 B”的有效标准转换 ([conv.ptr]),则程序格式不正确。空指针值转换为目标类型的空指针值。如果“指向 cv1 B 的指针”类型的纯右值指向实际上是 D 类型对象的子对象的 B,则生成的指针指向 D 类型的封闭对象。否则,行为未定义。


推荐阅读