为什么dynamic_cast在这里为nullptr提供私有继承

Why does dynamic_cast give nullptr with private inheritance here?

本文关键字:继承 nullptr dynamic cast 在这里 为什么      更新时间:2023-10-16

有人能向我解释一下吗:

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的成员函数。因此,在B::foo(。那么,为什么结果是nulptr呢?如果是受保护的继承,情况也是一样。将继承更改为公共继承,一切都很好。这是怎么回事?

dynamic_cast<T>(v)执行其运行时检查的方式在§5.2.7[expr.dynamic.cast]/p8:中指定

如果CT指向或引用的类类型,则运行时检查逻辑执行如下:

  • 如果在由v指向(引用)的最派生的对象中,v指向(参考)C对象的public基类子对象,并且如果只有一个类型为C的对象从子对象派生v指向o,结果指向C对象
  • 否则,如果v指向(引用)派生次数最多的对象的public基类子对象,以及派生次数最多对象的类型有一个类型为C的基类,它是明确的,而public是结果指向(指)最派生的C子对象对象
  • 否则,运行时检查将失败

请注意,该检查仅对公共基础成功。