簡體   English   中英

覆蓋具有不同返回類型的虛函數

[英]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*

在您的示例中,繼承層次結構中的類型可以隱式地向下轉換,從BA ,這也允許使用協變返回類型。 但是,您嘗試隱式地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.

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