[英]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*>
。 如果可以肯定的話,則應該使變量b
為D*
。
在C ++中,無論運行時的情況如何,都應在編譯時對所了解的程序狀態進行編碼。 通過將D*
存儲到B* b
,您在告訴編譯器不要 “知道”所指向的數據是“ D
”。 相反,您說的是“使用B*b
的代碼對任何指向B
指針都應該有效。顯然D* d = b->clone();
不能保證對每個指向B
指針都有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.