【问题标题】:VS2008 C++ can't seem to inherit const overloaded method [duplicate]VS2008 C++似乎无法继承const重载方法[重复]
【发布时间】:2014-02-22 18:02:49
【问题描述】:

我只是惊讶地发现以下内容在 VS2008 中无法编译。 编译器抱怨它无法将参数 1 从 const int 转换为 int& 从而表明它无法查看 Base 类中的可用方法。

这是有充分的理由还是其他编译器没有发现的缺陷?

struct Base
{
    virtual void doIt(int& v){cout << "Base NonConst v=" << v << endl;}
    virtual void doIt(const int& v) const {cout << "Base Const v=" << v << endl;}
};

struct Child : public Base
{
    virtual void doIt(int& v){cout << "Child NonConst v=" << v << endl;}    
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 99;
    const int& c_i = i;

    Child sc;
    sc.doIt(i);
    sc.doIt(c_i);
}

如果我删除了 Child 类中的单个重写方法,或者我通过 Base 指针访问子类(或者当然,如果我重写了子类中的两个方法),这将按预期编译和工作。

但是,当直接从子类或子类指针访问时,重写一个而不是另一个方法似乎隐藏了未重写的基类方法。

什么鬼?我错过了什么吗?

【问题讨论】:

  • 在类中查找成员名称时,如果类声明中有该名称的成员,则不检查基类。

标签: c++ inheritance overriding constants overloading


【解决方案1】:

您收到的此错误将在每个编译器(包括 gcc、msvc 2013 等)中发生。

no matching function for call to ‘Child::doIt(const int&amp;)’ sc.doIt(c_i);

这就是问题所在。您正在覆盖函数 doIt 并且仅在父类有两个时提供一个覆盖。它不会搜索父类,因为您正在覆盖它。

您应该提供这两种覆盖:

struct Child : public Base
{
    virtual void doIt(int& v){cout << "Child NonConst v=" << v << endl;}    
    virtual void doIt(const int& v) const { Base::doIt(v);}
};

或者您也可以像这样 (C++11) 执行using 语句:

struct Child : public Base
{
    virtual void doIt(int& v){cout << "Child NonConst v=" << v << endl;}  

    using Base::doIt;
};

【讨论】:

  • 谢谢。我明白了,所以这通常与方法重载有关(不仅仅是我的示例中的特定 const 重载)。我必须说,令人失望的是,标准允许这种情况出现,而不是规定应该解决完整的成员签名。我更失望的是这在 C++11 中没有改变。关心评论为什么?再次感谢
  • @OldSchool 为什么?因为 A) 这是保护程序的默认设置:不需要检查所有基类中的所有私有函数。 B)通过“使用”,您可以获得其他行为;如果其他行为是默认行为,则无法获得隐藏行为。
猜你喜欢
  • 2015-08-04
  • 2013-04-25
  • 2023-03-21
  • 1970-01-01
  • 2017-01-07
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多