簡體   English   中英

為什么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的成員函數。因此,從A *到B *的dynamic_casting在B :: foo()中應該沒問題。 那么為什么結果為nullptr? 如果它是受保護的繼承,則同樣如此。 將繼承更改為public,一切都很好。 這里發生了什么?

dynamic_cast<T>(v)執行其運行時檢查的方式在§5.2.7[expr.dynamic.cast] / p8中指定:

如果CT指向或引用的類類型,則運行時檢查在邏輯上執行如下:

  • 如果,在最派生對象尖(簡稱)由vv點(指)向public一個的基類子對象C對象,並且如果只有一個類型的對象C從子對象衍生的尖(簡稱)至o通過v結果點(引用)到該C對象。
  • 否則,如果v指向(引用)最派生對象的public基類子對象,並且最派生對象的類型具有類型C的基類,即明確且public ,則結果指向(引用)最派生對象的C子對象。
  • 否則,運行時檢查失敗。

請注意,檢查僅對公共基礎成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM