簡體   English   中英

C++ 動態類型 - 覆蓋方法

[英]C++ dynamic type - overriding methods

正常覆蓋將以這種方式工作:

class Fruit {
public:
    string color();
};

string Fruit::color() {
    return "Unkown";
};

class Apple : public Fruit {
public:
    string color();
};

string Apple::color() {
    return "Green";
};

現在,你會這樣稱呼它:

Apple *apple = new Apple();
std::cout << apple->color();

這將 output Green ,這是正確的,但是,在以下情況下運行它(這只是一個例子:當然):

Apple *apple = new Apple();
printHealthy(apple);

// Method printHealthy:

void printHealthy(Fruit *fruit) {
    std::cout << fruit->color();
};

這將 output Unkown ,我可以理解,因為您將 Apple 轉換為 Fruit,因此“替換”其方法。 但是我怎么才能知道它的真實顏色呢?
要求:

  • 我需要知道它的真實顏色是什么。
  • 我不能依賴Apple級。 將會有更多Apple的,分配在 go 上。
  • 每個Apple類(例如Tomato ,它們當然有不同的名稱)都是Fruit的子類。
  • 並非每個 class 都實現所有方法。 例如,可能有一個顏色“未知”的Apple ,因此它不會覆蓋該方法,而是運行Fruit的方法。

在基礎 class 中標記virtual function。

class Fruit {
public:
    virtual string color();
};

你忘了virtual virtual關鍵字添加到color聲明中,您的代碼將打印正確的顏色。 C++ 只會對聲明為virtual的函數執行動態查找。

color方法應該是一個虛擬方法。

現在, color方法不是虛擬的。 編譯器在編譯時決定調用哪個方法。 您想要的是在運行時根據 class 的實際類型執行此操作。

暫無
暫無

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

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