【问题标题】:How to call virtual function with same name but different parameters? [duplicate]如何调用同名但参数不同的虚函数? [复制]
【发布时间】:2013-10-06 19:34:05
【问题描述】:

标题可能不是很有描述性,但很难用一句话来描述我想要的。

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

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) 符合“f(int)”对于 HelpBase 是未知的。

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

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

【问题讨论】:

  • @EdS。为什么它会是一个未定义的函数? HelpBase 是一个抽象类,不能实例化。必须有任何其他类将继承它,并定义缺少纯虚函数。

标签: c++


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多