gpt4 book ai didi

c++ - 如何在基类中使用接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 01:57:12 26 4
gpt4 key购买 nike

考虑以下代码:

#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中使用接口(interface)ITimer,但是该方法是在类B中实现的。所以我继承了类中的接口(interface),但编译器不满意:

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 中使用接口(interface),而它的方法在类 B 中实现。

谢谢。

最佳答案

继承是万恶之源。

A也不B ITimer

A连纯虚都没有实现,所以无法实例化。因此,继承自 A使 C 也很抽象(无法实例化)。

你不想在这里使用继承。见


在这种情况下,可以通过添加 virtual 来修复可怕的死亡钻石等级 :

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

查看 Live on IdeOne 。不过,我不推荐这样做。考虑修复设计。

另见 Diamond inheritance (C++)

关于c++ - 如何在基类中使用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19021812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com