C++:如何重写具有相同接口的特定类的方法

i c*_*ant 2 c++ inheritance interface

我遇到一种情况,我需要从具有相同接口的两个类继承,但要单独覆盖它们,并且我绝对无法调整接口。请参阅下面的代码示例

template<typename T>
struct Foo
{
    virtual ~Foo() = default;
    virtual void foo() = 0;
};

struct Derived : public Foo<int>, public Foo<double>
{
#if 0 // having something like this would be great, but unfortunately it doesn't work
    void Foo<int>::foo() override
    {
        std::cout << "Foo<int>::foo()" << std::endl;
    }

    void Foo<double>::foo() override
    {
        std::cout << "Foo<double>::foo()" << std::endl;
    }
#endif
};
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nov 5

您始终可以定义声明自己的接口的中间类:

template<typename T>
struct Foo
{
    virtual ~Foo() = default;
    virtual void foo() = 0;
};

struct ProxyFooInt : public Foo<int>
{
    virtual void fooInt() = 0;
    
    void foo() override
    {
        return fooInt();
    }
};

struct ProxyFooDouble : public Foo<double>
{
    virtual void fooDouble() = 0;
    
    void foo() override
    {
        return fooDouble();
    }
};

struct Derived : public ProxyFooInt, public ProxyFooDouble
{
    void fooInt() override
    {
        std::cout << "Foo<int>::foo()" << std::endl;
    }

    void fooDouble() override
    {
        std::cout << "Foo<double>::foo()" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

更高级的解决方案是使用 CRTP:

template<typename D>
struct CrtpFooInt : public Foo<int>
{
    void foo() override
    {
        return static_cast<D*>(this)->fooInt();
    }
};

template<typename D>
struct CrtpFooDouble : public Foo<double>
{
    void foo() override
    {
        return static_cast<D*>(this)->fooDouble();
    }
};

struct Derived : public CrtpFooInt<Derived>, public CrtpFooDouble<Derived>
{
    void fooInt()
    {
        std::cout << "Foo<int>::foo()" << std::endl;
    }

    void fooDouble()
    {
        std::cout << "Foo<double>::foo()" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)