У меня есть два класса: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, и я уверен, что он работал в нем. Что-то изменилось?
Tht идеальная ситуация для проверки переопределения. Добавьте его в функцию TString & Copy (..) и посмотрите на жалобы компилятора – marom
Вы можете посмотреть [Covariance_and_contravariance] (http://en.wikipedia.org/wiki/Covariance_and_contravariance_ (computer_science)). – Jarod42
Хорошо, ты выиграл. Я могу добавить оператор присваивания в 'TString', чтобы решить эту проблему, но мне любопытно, есть ли способ вызвать' TString :: Copy' из 'TArray'? –