我已经阅读了主题Downcasting a base type,我仍然怀疑。
class Base
{
int i;
};
class Derived : public Base
{
};
int main()
{
Base* x = new Base();
Derived* y = static_cast<Derived*>(x);
return 0;
}
我是否理解即使这段代码已经错误并且可能导致未定义的行为?
我问它,因为我无法完全理解标准短语:
如果“指向cv1 B的指针”类型的右值指向的是B. 实际上是D类型的对象的子对象,结果指针 指向类型D的封闭对象。否则,结果为 演员未定义。
单词&#34; subobject&#34;困惑我。这里指针 x 指向整数 i 。但是这个整数可以被认为是一个派生对象,不是吗?因为任何Deived对象也只是一个整数。而这个整数显然是它自身的一个子对象。所以这里没有UB。
或者(如果这个推理是错误的)这个短语是否暗示我们应该总是在某处创建Derived对象?所以它应该像这里一样,例如:
Derived* z = new Derived();
// ...
// And only if the actual creation of a Derived instance
// took place somewhere the below code is ok
Base* x = z;
Derived* y = static_cast<Derived*>(x);