簡體   English   中英

使用虛函數的協變返回類型的C ++無效轉換錯誤

[英]C++ invalid conversion error using covariant return types with virtual functions

在下面的代碼中,我可以將D::clone()的返回值分配給指向B的指針,而不分配給D的指針。 是否可以從基本指針的調用中返回實際的多態類型?

struct B
{
    virtual B * clone() { return this; }
};

struct D : B
{
    D * clone()
    {
        std::cout << std::is_same<decltype(this), D *>::value << std::endl;
        return this;
    }
};

int main()
{
    B * b = new D();
    B * bb = b->clone(); // prints "1"
    std::cout << std::is_same<decltype(b->clone()), D *>::value << std::endl; // prints "0"
    D * d = b->clone(); // error: invalid conversion from B * to D * (GCC 5.1)
}

否。在D的基類B上調用clone()會將D*強制轉換為B*

如果絕對確定,可以執行static_cast<D*>如果不確定,可以執行dynamic_cast<D*> 如果可以肯定的話,則應該使變量bD*

在C ++中,無論運行時的情況如何,都應在編譯時對所了解的程序狀態進行編碼。 通過將D*存儲到B* b ,您在告訴編譯器不要 “知道”所指向的數據是“ D ”。 相反,您說的是“使用B*b的代碼對任何指向B指針都應該有效。顯然D* d = b->clone();不能保證對每個指向B指針都有效。

暫無
暫無

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

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