4

タイトルはあまり説明的ではないかもしれませんが、私が欲しいものを短い文で説明するのは難しい.

だから私はこのような基本クラスを持っています:

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));
    }
 }

私の目標は、 f(int); を実装する他のクラスに継承される抽象クラス HelpBase を提供することです。

私の HelpBase では、実行時にこれらのクラスの 1 つによって提供される f(int) を使用したいのですが、それを呼び出す方法がわかりません。

上記の例では、コンパイラ (gcc) は、"f(int)" が HelpBase に対して不明であると準拠しています。

IHelpBase::f() として書くことはできません。これは、IHelpBase の純粋な仮想メンバーの使用を強制するためです (gcc も文句を言います)。基本クラスで宣言されているが、実際にはいくつかの継承クラスで定義されている関数を使用する方法は?

f は float、g は int のように 2 つの異なる名前を使用しても問題ありません。次に、g(static_cast(arg)); を呼び出すことができます。私のヘルプベースで、期待どおりに動作します。

4

1 に答える 1

10

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);
}
于 2013-09-30T20:09:53.020 に答える