2012-05-15 64 views
1

我試圖重寫基類中的另一種方法使用的基類的方法;但是,當派生類調用基類的using方法時,派生的used-method從不執行,而是調用基類的used-method。下面是一個例子:C++使基類在子類中使用重寫的方法

#include <iostream> 
using namespace std; 
class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    int getLeft() { return 0; } 
}; 

class Derived: public Base { 
public: 
    Derived() {} 
    virtual ~Derived() {} 
    int getLeft() { return 1; } 
}; 
int main(int argc, char *argv[]) { 
    Derived d = Derived(); 
    d.printLeft(); 
} 

運行main()打印0,表明BasegetLeft()方法使用,而不是派生的對象的方法。

如何更改此代碼,使Derived::getLeft()在Derived的實例中調用時調用

+0

對不起,我沒有時間。這個項目明天到期。但是,謝謝你的建議。 – weberc2

+0

對於downvoter(s),這個問題有什麼特別錯誤嗎?我應該澄清一些事情嗎?我試圖研究,但由於我不知道我想描述的現象的術語,所以我無法找到任何相關的結果。 – weberc2

+0

我低估了這個問題,但直到你告訴我你不願意讀一本書來學習C++時,我才這樣做。 –

回答

6

你只需要做出getLeft虛擬:

class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    virtual int getLeft() { return 0; } 
}; 

默認情況下,在C++中,成員函數不是虛擬的。也就是說,你不能在子類中重寫它們。

+1

謝謝先生。你是一個紳士和學者。 – weberc2

+2

那麼,你*可以*覆蓋它們,這只是當通過基類指針或引用調用覆蓋時不會有任何效果。 – JohnMcG

+0

不客氣。 – Nick

1

對於非虛函數,該對象的靜態類型用於確定調用哪個類的方法。

在你的情況,你從Base::printLeft()打電話給getLeft()this的類型爲Base*,因此調用的函數將爲Base::getLeft()

解決方法是使用virtual關鍵字。在這種情況下,虛函數表將被用來確定要調用其中getLeft()版本,在這種情況下Derived.

您可以通過在這兩個BaseDerived前面加上virtualprintLeft聲明觸發此行爲。

相關問題