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

时间:2013-09-30 19:56:09

标签: c++

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

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

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

然后我创建了一个抽象类,它只为浮点数定义f:

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

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

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

在上面的例子中,编译器(gcc)complians对于HelpBase来说“f(int)”是未知的。

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

如果我使用两个不同的名称,例如f代表浮点数,g代表整数,则没有问题。然后我可以调用g(static_cast(arg));在我的HelpBase中,它按预期工作。

1 个答案:

答案 0 :(得分:9)

我认为您错过了添加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);
}