考虑以下代码
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)
不应被覆盖,它应该保持不变。
Y
但是,在方法中创建类型对象main
并调用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{};
,那么一切正常。为什么会这样?