【发布时间】:2012-09-18 23:09:52
【问题描述】:
考虑下面的代码
class X{
public:
virtual void foo(X x){ }
virtual void foo(int index){ }
};
class Y : public X{
public:
void foo(int index){ }
};
int main(){
Y y;
y.foo(X()); //Error, see below
}
X 类重载了虚拟foo 方法。一个版本采用X,另一个采用int。现在类Y 继承自X 并覆盖方法foo(int)。 foo(X) 方法不能被覆盖,它应该保持不变。
但是,当在main 方法中创建Y 类型的对象并调用foo(X) 时,编译器会报错:
In function ‘int main()’:
error: no matching function for call to ‘Y::foo(X)’
note: candidate is:
note: virtual void Y::foo(int)
note: no known conversion for argument 1 from ‘X’ to ‘int’
因此,唯一的候选者是被覆盖的foo(int) 方法。似乎另一种方法已经消失了。如果我删除了覆盖版本,即将Y 声明为public Y : public X{};,那么一切正常。为什么会这样?
【问题讨论】:
标签: c++ overloading overriding