C菱形接口继承

我有一个层次结构:

class ICommand
{
    public:
        virtual void start() = 0;
};

class IExtendedCommand : public ICommand
{
    public:
        virtual void doSomethingElse() = 0;
};

class ConcreteCommand : public ICommand
{
    public:
        virtual void start() {};
}    
class ExtendedConcreteCommand : public ConcreteCommand, public IExtendedCommand
{
    public:
        virtual void doSomethingElse() {};
}

ICommand和IExtendedCommand对象由工厂创建.

由于某种原因,当编译器说ICommand的所有方法在ExtendedConcreteCommand中都是纯…

任何想法为什么以及如何解决这个问题?

PS:是的,我正在将Android应用程序移植到C / Qt(我已经3年没有使用过了).
无论如何,我想听听您如何应对.

编辑:

我要移植的是用于MPC和VLC的远程控制应用程序.
这个想法是创建可以通过工厂发送到播放器的命令.
Factory返回一个指向实现ICommand的对象的指针.因此,通过切换工厂实现,可以创建不同的命令. ICommand声明了所有主要方法和信号. IExtendedCommand在播放器中添加了一些通用信息.所以我想做的是通过工厂实例化IExtendedCommand,设置一些属性,然后使用start()方法启动它.我也想重用ConcreteCommand的功能.这导致了我描述的问题.

最佳答案
你没有钻石.你有这个:

   +----------------------------------- missing start() !
   V
pv start()     pv doSomethingElse()     concrete doSomethingElse()

ICommand  ---> IExtendedCommand   ---\
                                      > ExtendedConcreteCommand
ICommand  ---> ConcreteCommand    ---/

pv start()     concrete start()

这意味着您有两个ICommand类型的基类,并且您需要覆盖它们的两个纯方法.但是,只有ConcreteCommand会覆盖start的“底部”版本,而另一个则不会被覆盖.

如果您想要一个实际的菱形,则需要使用虚拟继承将ICommand基类虚拟化:class IExtendedCommand:虚拟公共ICommand,对于ConcreteCommand同样如此.另外,您可以在ExtendedConcreteCommand中提供另一个替代程序来启动.

转载注明原文:C菱形接口继承 - 代码日志