以下是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;
}
是UB。摘录自标准(强调我的):
类型为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的封闭对象。否则,行为是不确定的。