为什么虚函数被隐藏? [英] Why does a virtual function get hidden?

查看:123
本文介绍了为什么虚函数被隐藏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下类:

  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.

这篇关于为什么虚函数被隐藏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆