派生类返回分配的基类实例

问题描述 投票:1回答:1

以下是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++ inheritance language-lawyer static-cast
1个回答
4
投票

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

8.2.9 Static cast - bullet 11

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

© www.soinside.com 2019 - 2024. All rights reserved.