簡體   English   中英

虛函數 const 與虛函數非常量

[英]virtual function const vs virtual function non-const

class Base
{
   public:
   virtual void func() const
   {
     cout<<"This is constant base "<<endl;
   }
};

class Derived : public Base
{
   public:
   virtual void func()
   {
     cout<<"This is non constant derived "<<endl;
   }
};


int main()
{
  Base *d = new Derived();
  d->func();
  delete d;

  return 0;
}

為什么輸出打印“這是常數基數”。 但是,如果我在 func() 的基本版本中刪除 const,它會打印“這是非常量派生的”

d->func() 應該正確調用派生版本,即使 Base func() 是 const 對嗎?

 virtual void func() const  //in Base
 virtual void func()        //in Derived

const部分實際上是函數簽名的一部分,這意味着派生類定義了一個函數而不是覆蓋基類函數。 這是因為他們的簽名不匹配。

當刪除const部分時,它們的簽名匹配,然后編譯器將func的派生類定義視為基類函數func重寫版本,因此如果對象的運行時類型是Derived類型,則調用派生類函數。 這種行為稱為運行時多態性。

virtual void func()實際上與virtual void func() const具有不同的簽名。 因此,您沒有覆蓋原始的只讀基本函數。 您最終在 Derived 中創建了一個新的虛函數。

如果您曾經嘗試創建指向成員函數 (PTMF) 的指針,您也可以了解更多相關信息,但這是一種罕見的必要性(然而,這可能對學習或練習有益)。

C++11 中的 override 關鍵字對於幫助避免此類錯誤特別方便。 然后編譯器會告訴您,您在派生中對 'func' 的定義不會覆蓋任何內容。

不,因為virtual void func()不是virtual void func() const的覆蓋。

暫無
暫無

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

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