【问题标题】:Visual C++ - Virtual method is not overridenVisual C++ - 虚拟方法未被覆盖
【发布时间】:2015-06-09 11:27:09
【问题描述】:

我有两个班级:

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 项目中移动一些代码,我很确定它已经在其中工作了。有什么变化吗?

【问题讨论】:

  • 这是测试覆盖的完美情况。将其添加到 TString &Copy(..) 函数并查看编译器抱怨
  • 你可以看看Covariance_and_contravariance
  • 好的,你赢了。我可以在TString 中添加赋值运算符来解决这个问题,但我很好奇有没有办法从TArray 调用TString::Copy

标签: c++ templates inheritance polymorphism visual-studio-2015


【解决方案1】:

您没有覆盖任何内容,因为这些方法具有不同的签名:

TArray& Copy(const TArray &array)

TString& Copy(const TString &string)

【讨论】:

    【解决方案2】:

    重写的签名应该相同。在你的情况下,有两个不同的签名。

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

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 2013-01-15
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2012-06-19
      • 2014-01-05
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多