簡體   English   中英

為什么在虛擬 function 聲明中使用不同的返回類型會引發錯誤而不是導致重新定義?

[英]Why using a different return type in virtual function declaration throws an error instead of resulting in a redefinition?

底座 class:

class Base
{
    public:
        virtual int f() const
        {
            return 1;
        }
};

派生 class:

class Derived: public Base
{
    public:
        void f() const {}
};

上面的代碼拋出“返回類型不相同/協變錯誤”。

我讀過一些關於它的討論。 這個類似,但他們只說如果返回類型不同/協變,它將破壞代碼。 用不同的返回類型覆蓋成員 function

為什么我期望的行為沒有發生?

預期行為:Derived 中的 VPTR 指向 Base::f() (我讀過如果沒有為虛擬 function 提供覆蓋,派生對象將只使用繼承的 class 版本)。 它還隱藏了名稱 f() 所以現在這樣的調用:

Derived x;
x.f();

應該調用 Derived::f() 和這樣的調用:

x.Base::f();

應該調用 Base::f() function。 這似乎不像破壞代碼。 萬一它被升級了,即使那樣它也不應該破壞代碼,因為兩個類的 VPTR 都指向同一個 Base::f()

我能想到的唯一原因是這樣的聲明(相同的簽名和協變/相同的返回類型)被保留用於覆蓋虛擬方法,我們不能使用它來導致我期望的行為。

當編譯器遇到匹配的簽名(參數、常量)時,它會自動將void f() const聲明變為虛擬。 所以Derived的定義解釋為:

class Derived: public Base
{
    public:
        virtual void f() const {} // virtual keyword is added
};

它顯然看起來像是試圖覆蓋Base::f() 這一切都是因為 function 簽名在BaseDerived class 中匹配。 如果簽名不匹配,那么這只會是重新定義,在這種情況下,它將隱藏Derived class 中的Base::f()

暫無
暫無

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

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