【发布时间】:2022-01-21 12:22:55
【问题描述】:
我有以下代码:
struct Abs {
virtual void f(int x) = 0;
virtual void f(double x) final { std::cout << 2; }
};
struct Sub: public Abs {
void f(int x) final { std::cout << 1; }
};
Abs 是一个抽象类,它包含一个纯成员函数void f(int) 及其重载版本void f(double x),它不再是纯成员函数final。如果我尝试在派生结构Sub 中覆盖void f(int),它会遮蔽void f(double),下面的main 函数会打印1,将1.01 转换为int:
int main() {
Sub x = {};
x.f(1.01);
return 0;
}
我该如何克服这个问题?还有,为什么会这样?
【问题讨论】:
-
它是这样工作的,因为标准要求它这样做。查找“隐藏规则”。它不仅适用于类 - 它也适用于嵌套范围。在您的情况下,“修复”是让
Sub类有一行using Abs::f,这会在Sub的上下文中调用f()时使Abs::f()的两个版本成为候选对象。跨度> -
您可以将参数括在大括号中,并且将禁止隐式转换。这样您就可以事先了解如何将 double 缩小为 int。
标签: c++ inheritance overriding overloading abstract-class