我很惊讶地发现以下内容无法在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类方法。
到底是什么?我错过了什么吗?
答案 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;
};