我有以下类:
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不接受0个参数。 不应该在B的函数重载它,因为它是一个虚函数?
EDIT :我的确想要从A继承B,它显示了相同的行为。解决方案假设您希望 B 从 / code>:
f(int)和 f / code>是不同的签名,因此具有不同的功能。
您可以使用具有兼容签名的函数覆盖< ,这意味着相同的签名,或者其中返回类型是更具体(这是协方差)。
否则,您的派生类函数隐藏虚拟函数,就像其他派生类声明与基类函数同名的函数一样。您可以使用A :: f; c>在B类中放置以取消隐藏
(static_cast< A *(b)) - > f(); 或者 b-> A :: f ; 。区别是如果 B 实际上覆盖 f(),则前者调用覆盖,而后者调用 A 中的函数,无论。
I have the following classes:
class A { public: virtual void f() {} }; class B : public A{ public: void f(int x) {} };If I say
B *b = new B(); b->f();the compiler says error C2660: 'B::f' : function does not take 0 arguments. Shouldn't the function in B overload it, since it is a virtual function? Do virtual functions get hidden like this?
EDIT: I indeed meant to inherit B from A, which shows the same behaviour.
解决方案Assuming you intended B to derive from A:
f(int) and f() are different signatures, hence different functions.
You can override a virtual function with a function that has a compatible signature, which means either an identical signature, or one in which the return type is "more specific" (this is covariance).
Otherwise, your derived class function hides the virtual function, just like any other case where a derived class declares functions with the same name as base class functions. You can put using A::f; in class B to unhide the name
Alternatively you can call it as (static_cast<A*>(b))->f();, or as b->A::f();. The difference is that if B actually does override f(), then the former calls the override, whereas the latter calls the function in A regardless.
更多推荐
为什么虚函数被隐藏?
发布评论