- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有两个重载函数 f(void)
和 f(int)
的基类。 Derived
类通过调用 f(void)
实现 f(int)
。 Derived2
仅实现 f(void)
。
编译器拒绝实现 Derived::f(int)
因为它想调用 f(int)
但我没有提供任何参数,因为我想调用 f(void)
。为什么编译器会拒绝它?为什么添加行 virtual int f(void) = 0;
可以解决我的问题?
class Base
{
public:
explicit Base(void) {}
virtual ~Base(void) {}
virtual int f(void) = 0;
virtual int f(int i) = 0;
};
class Derived : public Base
{
public:
// provide implementation for f(int) which uses f(void). Does not compile.
virtual int f(int i) {puts("Derived::f(int)"); return f();}
// code only compiles by adding the following line.
virtual int f(void) = 0;
};
class Derived2 : public Derived
{
public:
// overwrite only f(void). f(int) is implemented by Derived.
virtual int f(void) {puts("Derived2::f(void)"); return 4;}
};
int main(void)
{
Base * p = new Derived2();
int i0 = p->f(); // outputs Derived2::f(void) and returns 4
int i1 = p->f(1); // outputs "Derived::f(int) Derived2::f(void)" and return 4
delete p;
return 0;
}
最佳答案
Derived::f
隐藏 Base::f
。给定 Derived::f(int)
主体中的 return f();
,在 范围内找到名称
,然后 name lookup停止。 f
>派生Base
中的名称将不会被发现并参与重载解析。
name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.
您可以添加using Base::f;
,将Base
中的名称引入到Derived
的范围中。
class Derived : public Base
{
public:
using Base::f;
// provide implementation for f(int) which uses f(void).
virtual int f(int i) {puts("Derived::f(int)"); return f();}
};
关于c++ - 为什么需要重新声明重载的虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65018186/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!