![](/img/trans.png)
[英]c++ override virtual function with const parameter instead of non-const parameter
[英]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.