【发布时间】: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