如何调用名称相同但参数不同的虚函数

How to call virtual function with same name but different parameters?

本文关键字:参数 函数 何调用 调用      更新时间:2023-10-16

标题可能不是很具有描述性,但很难用简短的句子描述我想要的东西。

所以我有一个这样的基类:

class IBase
{
public:
    virtual void f(int) = 0;
    virtual void f(float) = 0;
}

然后我创建一个抽象类,它只为float定义f

class HelpBase: public IBase
{
public:
    virtual void f(float arg) override
    {
        f(static_cast<int>(arg));
    }
 }

我的目标是提供一个抽象类HelpBase然后由其他将实现f(int)的类继承;

在我的HelpBase我想使用f(int)在运行时将由其中一个类提供,但我不知道如何调用它。

在上面的示例中,编译器 (GCC) 符合 HelpBase 未知f(int)

我不能把它写得那么IHelpBase::f()因为它会强制使用IHelpBase的纯虚拟成员(GCC 也抱怨)。如何使用在基类中声明但实际上在某些继承类中定义的函数?

如果我使用两个不同的名称,例如f表示floatg表示int,则没有问题。然后我可以在我的HelpBase中调用g(static_cast<int>(arg)),它按预期工作。

我想您错过了添加using声明来解除基类的重载集f

#include <iostream>
class IBase
{
public:
    virtual void f(int) = 0;
    virtual void f(float) = 0;
};
class HelpBase: public IBase
{
public:
    using IBase::f;
    virtual void f(float arg) override
    {
        std::cout << 1 << std::endl;
        f(static_cast<int>(arg));
        std::cout << 3 << std::endl;
    }
};
class X: public HelpBase
{
public:
    using HelpBase::f;
    virtual void f(int) override
    {
        std::cout << 2 << std::endl;
    }
};
int main()
{
    X x;
    x.f(0.1f);
}