VS2008 C ++似乎无法继承const重载方法

时间:2014-02-22 18:02:50

标签: c++ inheritance override const overloading

我很惊讶地发现以下内容无法在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指针访问子类(或者当然我覆盖子类中的两个方法),则编译并按预期工作。

然而,当直接从Child类或Child类指针访问时,覆盖一个而不是另一个方法似乎隐藏了未重写的Base类方法。

到底是什么?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

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

no matching function for call to ‘Child::doIt(const int&)’ 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);}
};

或者你也可以这样做using语句(C ++ 11):

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

    using Base::doIt;
};