为什么dynamic_cast在这里为nullptr提供私有继承
Why does dynamic_cast give nullptr with private inheritance here?
有人能向我解释一下吗:
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:中指定
如果
C
是T
指向或引用的类类型,则运行时检查逻辑执行如下:
- 如果在由
v
指向(引用)的最派生的对象中,v
指向(参考)C
对象的public
基类子对象,并且如果只有一个类型为C
的对象从子对象派生v
指向o
,结果指向C
对象- 否则,如果
v
指向(引用)派生次数最多的对象的public
基类子对象,以及派生次数最多对象的类型有一个类型为C
的基类,它是明确的,而public
是结果指向(指)最派生的C
子对象对象- 否则,运行时检查将失败
请注意,该检查仅对公共基础成功。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 如何在自删除后将对象设置为nullptr
- 头文件-继承c++
- 如何取消对nullptr的屏蔽,返回正确的对象
- 为什么在保护模式下继承升级不起作用
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- 为什么dynamic_cast在这里为nullptr提供私有继承