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

时间:2014-08-31 05:17:00

标签: c++ inheritance private

有人可以向我解释一下:

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,一切都很好。这是怎么回事?

1 个答案:

答案 0 :(得分:3)

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

  

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

     
      
  • 如果在v指向(引用)的最派生对象中,v指向(引用)public对象的C基类子对象,   如果只有一个C类型的对象派生自子对象   通过ov指向(引用)结果点(指)   C对象。
  •   
  • 否则,如果v指向(引用)最派生对象的public基类子对象,以及最派生对象的类型   有一个类型为C的基类,它是明确的public   结果点(引用)到派生最多的C子对象   对象。
  •   
  • 否则,运行时检查失败。
  •   

请注意,只有公共基地检查才能成功。