[英]Override virtual function with different return type
我知道,如果返回類型是協變的,則可以使用返回類型來覆蓋虛擬函數。
但是我們可以使用更改后的返回類型嗎? 否則返回類型將隱式轉換為基類函數的返回類型,例如B*
到A*
。
class A
{
public:
virtual A *func()
{
A *obj=0;
return obj;
}
};
class B:public A
{
public:
virtual B *func()
{
B *obj =0;
return obj;
}
};
int main()
{
A *obj = new B();
obj->func(); // does in fact call B::func()
B *obj2 = obj->func(); // throws error: invalid conversion from 'A*' to 'B*'
return 0;
}
似乎obj->func()
返回A*
而不是B*
,因此出現此轉換錯誤。
即使動態類型在實現中有所不同,靜態類型檢查仍必須保持。 因此,這實際上取決於所指向對象的靜態類型。 當您在A*
上調用虛擬成員時,返回類型指定為A*
。
如果要在B*
上調用它,則該函數的返回類型將(靜態地)為B*
。
B *obj = new B();
obj->func();
B *obj2 = obj->func(); // Okay now
每當您在C ++中處理運行時多規范時,確定接口的都是對象的靜態類型 。
obj
靜態類型為A*
因此obj->func()
將使用A *A::func()
聲明:
A*
) public:
動態類型是B*
,因此它將調用B* B::func()
而且由於協變類型實際上會將其返回值轉換為A*
。
在您的示例中,繼承層次結構中的類型可以隱式地向下轉換,從B
到A
,這也允許使用協變返回類型。 但是,您嘗試隱式地cast棄,
B *obj2 = obj->func();
由於obj
是一個A
實例,並且func()
靜態綁定到A
提供的簽名,因此無法使用。 如果必須從A::func()
獲取B*
,則可以使用顯式強制轉換
auto *obj2 = dynamic_cast<B*>(obj->func());
但這是一個不好的模式,因為它損害了多態性的整個觀點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.