考虑以下代码:
#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类中实现。
感谢。
答案 0 :(得分:4)
继承是所有邪恶的基础。
A
或B
ITimer
s
A甚至没有实现纯虚拟,因此无法实例化。因此,继承自A
也会使C
抽象(无法实例化)。
您不想在此处使用继承。参见
在这种情况下,可以通过添加virtual
来修复可怕的死亡钻石层次结构:
class A : public virtual ITimer
//...
class B : public virtual ITimer
查看 Live on IdeOne 。不过我不建议这样做。考虑修改设计。