用C++实现接口

Clu*_*ess 9 c# c++ porting interface multiple-inheritance

我通常使用C#编程,但我正在尝试做一些C++,并且在尝试用C++实现接口方面有点挣扎.

在C#中我会做这样的事情:

class Base<T>
{
    public void DoSomething(T value)
    {
        // Do something here
    }
}

interface IDoubleDoSomething
{
    void DoSomething(double value);
}

class Foo : Base<double>, IDoubleDoSomething
{
}
Run Code Online (Sandbox Code Playgroud)

在C++中我实现了这样:

template <class T>
class Base
{
public:
    virtual void DoSomething(T value)
    {
        // Do something here
    }
};

class IDoubleDoSomething
{
public:
    virtual void DoSomething(double value) = 0;
};

class Foo : public Base<double>, public IDoubleDoSomething
{
};
Run Code Online (Sandbox Code Playgroud)

问题是我无法实例化Foo,因为它是抽象的(不实现DoSomething).我意识到我可以实现DoSomething并在Base上调用该方法,但我希望有更好的方法来做到这一点.我有其他类从base继承不同的数据类型,我有其他类继承自不使用Base的IDoubleDoSomething.

任何帮助赞赏.

Chr*_*odd 1

正如其他人所指出的,基类中的两个函数是不相关的(尽管具有相同的名称和参数类型),因为它们没有共同的基类。如果你想让它们相关,你需要给它们一个共同的基类。

另外,一般来说,如果您希望多重继承正常工作,您需要将非私有基类声明为virtual. 否则,如果您有公共基类(正如您经常需要这种风格的代码),就会发生不好的事情。

因此,您可以按如下方式使您的示例工作:

template <class T>
class IDoSomething {
public:
    virtual void DoSomething(T value) = 0;
};

template <class T>
class Base : public virtual IDoSomething<T>
{
public:
    virtual void DoSomething(T value)
    {
        // Do something here
    }
};

class IDoubleDoSomething : public virtual IDoSomething<double>
{
};

class Foo : public virtual Base<double>, public virtual IDoubleDoSomething
{
};
Run Code Online (Sandbox Code Playgroud)