2015-06-09 105 views
0

我有兩個類:的Visual C++ - 虛擬方法不重寫

template <class T> 
class TArray 
{ 
public: 
    TArray& operator =(const TArray &array) { return Copy(array); } 
    virtual TArray& Copy(const TArray &array) { ... } 
} 

class TString : public TArray<TCHAR> 
{ 
public: 
    TString& Copy(const TString &string) { ... } 
} 

類還需要構造函數。 但是第二類中的方法Copy不會覆蓋第一類中的方法。 考慮以下代碼:

TString a = _T("aaa"); 
TString b; 
b = a; 

在第三行程序進入賦值運算符在TArray。其中thisarray確實是TString類型。但是當調用Copy時,程序按我的預期輸入方法TArray :: Copy,而不是TString :: Copy。爲什麼?

我正在使用Visual Studio 2015 RC,但我正在從Visual Studio 6.0項目中移動一些代碼,並且我很確定它已經在其中工作。有什麼改變?

+0

這是測試覆蓋的完美情況。將它添加到TString&Copy(..)函數並查看編譯器抱怨 – marom

+1

您可以查看[Covariance_and_contravariance](http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science))。 – Jarod42

+0

好的,你贏了。我可以在'TString'中添加賦值操作符來解決這個問題,但我很好奇有沒有辦法從'TArray'調用'TString :: Copy'? –

回答

5

你沒有覆蓋任何東西,因爲方法有不同的簽名:

TArray& Copy(const TArray &array) 

VS

TString& Copy(const TString &string) 
1

的簽名應該是相同的覆蓋。在你的情況下,有兩個不同的簽名。

TArray& Copy(const TArray &array) 
TString& Copy(const TString &string)