作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有以下类(class):
class A {
public:
virtual void f() {}
};
class B : public A{
public:
void f(int x) {}
};
如果我说
B *b = new B();
b->f();
编译器显示错误 C2660: 'B::f' : function does not take 0 arguments。B中的函数不应该重载它,因为它是一个虚函数吗?虚函数会这样隐藏吗?
编辑:我确实打算从 A 继承 B,这显示了相同的行为。
最佳答案
假设您打算 B
源自 A
:
f(int)
和 f()
是不同的签名,因此不同的功能。
您可以使用具有兼容签名的函数覆盖虚函数,这意味着签名相同,或者返回类型“更具体”(这是协方差)。
否则,您的派生类函数会隐藏虚函数,就像派生类声明与基类函数同名的函数的任何其他情况一样。你可以把using A::f;
在 B 类中取消隐藏名称
您也可以将其称为 (static_cast<A*>(b))->f();
,或作为 b->A::f();
.不同的是,如果 B
实际上确实覆盖了 f()
,则前者调用override,而后者调用A
中的函数无论如何。
关于c++ - 为什么虚函数会被隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146499/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!