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. В нем this и array действительно имеют тип TString. Но когда вызывается Copy, программа вводит метод TArray :: Copy, а не TString :: Copy, как я ожидал. Зачем?

Я использую Visual Studio 2015 RC, но я перемещаю некоторый код из проекта Visual Studio 6.0, и я уверен, что он работал в нем. Что-то изменилось?

+0

Tht идеальная ситуация для проверки переопределения. Добавьте его в функцию TString & Copy (..) и посмотрите на жалобы компилятора – marom

+1

Вы можете посмотреть [Covariance_and_contravariance] (http://en.wikipedia.org/wiki/Covariance_and_contravariance_ (computer_science)). – Jarod42

+0

Хорошо, ты выиграл. Я могу добавить оператор присваивания в 'TString', чтобы решить эту проблему, но мне любопытно, есть ли способ вызвать' TString :: Copy' из 'TArray'? –

ответ

5

Ты ничего не перекрывая, потому что методы имеют различные сигнатуры:

TArray& Copy(const TArray &array) 

против

TString& Copy(const TString &string) 
1

Подпись должна быть одинаковой для переопределения. В вашем случае есть две разные подписи.

TArray& Copy(const TArray &array) 
TString& Copy(const TString &string) 
Смежные вопросы