2

考虑以下定义:

struct A {
   // ...
};

struct B : public A {}; // empty

void f(B& b) { /* use b */}

void g(A& a) {
   f(static_cast<B&>(a)); // is this a safe downcast?
}

int main() {
   A a;
   g(a);
}

在上面的例子a中确实是一个实例A

由于B有一个空定义,我想知道在这种特定情况下,对 f 的调用及其执行是否是未定义的行为。

4

2 回答 2

6

不,这不是合法的强制转换,因为它是在不是 type 的对象上执行的B。您的程序具有未定义的行为。

根据 C++11 标准的第 5.2.9/2 段:

如果从“指向”的有效B标准B转换为“指向 ” 的指针存在(4.10), cv2与 cv1具有相同的 cv 限定或大于cv1的 cv 限定,并且既不是 的虚拟基类也不是 的虚拟基类的基类。结果的类型为“<em>cv2 ”。“<em>cv1 ”类型的 xvalue 可以转换为“对 cv2 的右值引用类型,具有与“<em>cv1”类型的左值相同的约束。 DDBDBBDDDB DB如果类型“cv1 B”的对象实际上是类型对象的子对象D,则结果引用类型的封闭对象D。否则,行为未定义

于 2013-05-15T13:56:00.090 回答
2

不。不管你所说的安全是什么意思,这种转换是不正确的,真实的对象是类型的AB所以你不能向下转换到B

于 2013-05-15T13:56:30.600 回答