C++ 将重载和覆盖结合起来会导致奇怪的行为
C++ Combining overloading and overriding results in strange behaviour
>请考虑以下代码
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{};
,那么一切正常。为什么会这样?
当派生类定义与基类中的成员同名的成员时,派生类名将隐藏基类名。
在您的情况下,函数Y::foo
隐藏X::foo
.您需要将其纳入Y
范围,如下所示:
class Y : public X{
public:
using X::foo; //it brings X::foo into the scope of Y
void foo(int index){ }
};
<</div>
div class="answers">重载适用于在同一作用域中定义的名称。所以类 Y
中的foo
不会重载类 X
中的foo
,因为它们在不同的作用域中定义。这被非正式地称为"名称隐藏"。若要将基类名称提取到派生类中,请添加 using 指令:
using X::foo;
相关文章:
- 在C++中混合覆盖和重载
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- 为什么调用具有通用或 r 值引用的重载覆盖函数是不明确的?
- C++重载和覆盖
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- (C++)重载运算符<<,如果我不使用endl,则覆盖输出
- C++运算符重载???它不是更像是覆盖吗?
- 覆盖 ADL 选择的重载
- 为什么我得到 C2883:函数声明与 - 在仅覆盖基类中的一个重载时通过使用 - delcaration 引入
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- C++ 将重载和覆盖结合起来会导致奇怪的行为
- 同时覆盖和重载C++类中的方法
- 基成员函数的所有重载是否可以被单个模板化成员函数覆盖和转发到
- 如果内部类具有与外部类同名的函数,那么它是否在 C++ 和 Java 中隐藏了覆盖或重载
- C++ 重载和覆盖解析时间
- 如何轻松地覆盖多个重载方法
- 我们可以重载在子类中被覆盖的方法吗?
- 无法推断模板参数/'n'重载都无法覆盖所有参数类型
- c++虚函数覆盖和重载
- 为什么当我覆盖未覆盖的重载函数的其他重载之一时,没有继承该函数?