簡體   English   中英

關於覆蓋現象的困惑

[英]Confusion about the phenomenon of overriding

我對什么時候說該函數被覆蓋有點困惑。

我的書說“當派生類創建一個與基類中的成員函數具有相同返回類型和簽名的函數,但使用新實現時,據說它會覆蓋該函數。”

我很清楚這本書在說什么,但我的問題是,如果我只保持名稱不變並更改返回類型和簽名,我可以說該函數被覆蓋還是有任何不同的術語? 就像我嘗試了以下代碼:

#include <iostream>
 using namespace std;
 class Mammal
{
 public:
  int Move() const  
   { 
    cout << "mammal moving\n"; 
    return 1; 
   }
   
  void Move(int x) const 
   {
    cout << "walked " << x << " steps\n"; 
   }
};
  
 class Dog : public Mammal
{
 public:
  void Move()
  { 
   cout << "Dog moving\n";
  }
};
  
 int main()
{
 Dog Moti;
 Moti.Move();
//Moti.Move(2);  error: no matching function for call to 'Dog::Move(int)'
 cout << endl;
 return 0; 
}

輸出:狗移動

所以我在Dog有 Move() 方法,但它的返回類型和簽名與Mammal Move() 方法不同。 所以說Dog中的 Move() 覆蓋了Mammal Move() 是否正確。 為什么我有這種困惑是因為當我調用Moti.Move(2) ,我收到錯誤。 這意味着Mammal void Move(int x) const被隱藏了。 但是,當基類中的重載方法之一在派生類中被覆蓋時,就會出現“隱藏”現象。 所以這就是為什么我認為“Dog 中的 Move() 覆蓋了 Mammal 中的 Move()”,但根據書籍定義,這似乎是錯誤的。

我做了一些互聯網搜索,發現“在虛擬函數的情況下,返回類型必須相同或協變”,但我的問題與虛擬函數或任何東西無關。 我只是很困惑我可以說上面的代碼中發生了覆蓋還是有任何不同的術語。

上面代碼中的問題讓我想起了 CPP 一個非常有趣的概念,名稱隱藏,它簡單地說,如果我們嘗試重載派生類中的方法,那么編譯器將隱藏基類方法,除非我們明確通知編譯器包含一個基類方法,或者我們使用像Moti.Mammal::Move(2);這樣的范圍解析運算符顯式調用基類方法Moti.Mammal::Move(2);

結帳一些相關文章:

https://bastian.rieck.me/blog/posts/2016/name_hiding_cxx/

在派生類中重載基類方法

https://www.geeksforgeeks.org/g-fact-89/

PS:我們不能重載基於返回類型的方法,如果我們嘗試這樣做會出錯。

暫無
暫無

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

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