[英]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的成員函數。因此,從A *到B *的dynamic_casting在B :: foo()中應該沒問題。 那么為什么結果為nullptr? 如果它是受保護的繼承,則同樣如此。 將繼承更改為public,一切都很好。 這里發生了什么?
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
子對象。- 否則,運行時檢查失敗。
請注意,檢查僅對公共基礎成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.