有人可以向我解释一下:
struct A {
virtual ~A() = default;
};
struct B : private A {
void foo() {
B* b = new B;
std::list<A*> list = {b};
B* back = dynamic_cast<B*>(list.back());
std::cout << back << std::endl;
}
};
int main() {
B b;
b.foo(); // nullptr
}
根据我的理解,只有B知道B是从A派生的.foo()是B的成员函数。因此从A *到B *的dynamic_casting应该在B :: foo()中很好。那么为什么结果为nullptr?如果它是受保护的继承,则同样如此。将继承更改为public,一切都很好。这是怎么回事?
答案 0 :(得分:3)
dynamic_cast<T>(v)
执行运行时检查的方式在§5.2.7[expr.dynamic.cast] / p8中指定:
如果
C
是T
指向或引用的类类型,则为运行时 检查逻辑执行如下:
- 如果在
v
指向(引用)的最派生对象中,v
指向(引用)public
对象的C
基类子对象, 如果只有一个C
类型的对象派生自子对象 通过o
将v
指向(引用)结果点(指)C
对象。- 否则,如果
v
指向(引用)最派生对象的public
基类子对象,以及最派生对象的类型 有一个类型为C
的基类,它是明确的public
结果点(引用)到派生最多的C
子对象 对象。- 否则,运行时检查失败。
请注意,只有公共基地检查才能成功。