如何在基类中使用接口?

时间:2013-09-26 07:19:57

标签: c++ design-patterns interface

考虑以下代码:

#include <stdio.h>
struct ITimer {
    virtual void createTimer() = 0;
};
class A : public ITimer
{
    public:
        void showA() {
            printf("showA\n");
            createTimer();
        }
};

class B : public ITimer
{
    public:
        void showB() {
            printf("showB\n");
        }
        void createTimer() {
            printf("createTimer");
        }
};

class C: public A, public B
{
    public:
        void test() {
            showA();
            showB();
        }
};

int main()
{
    C c;
    c.test();
    return 0;
}

我需要在A类中使用接口ITimer,但是该方法是在B类中实现的。所以我在A中继承了接口,但是编译器对它不满意:

test.cc
test.cc(38) : error C2259: 'C' : cannot instantiate abstract class
        due to following members:
        'void ITimer::createTimer(void)' : is abstract
        test.cc(5) : see declaration of 'ITimer::createTimer'

如何在基类A中使用该接口,而其方法在B类中实现。

感谢。

1 个答案:

答案 0 :(得分:4)

继承是所有邪恶的基础。

AB ITimer s

A甚至没有实现纯虚拟,因此无法实例化。因此,继承自A也会使C 抽象(无法实例化)。

您不想在此处使用继承。参见


在这种情况下,可以通过添加virtual来修复可怕的死亡钻石层次结构

class A : public virtual ITimer
//...
class B : public virtual ITimer

查看 Live on IdeOne 。不过我不建议这样做。考虑修改设计。

另见Diamond inheritance (C++)