关于C++:如何从实现与其他接口共享的接口的类继承

How to inherit from a class that implement an interface which is shared with other interface

我有这个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

struct Interface1
{
    virtual int getID()=0;
};

struct Interface2 : Interface1
{
    virtual int add(int a,int b)=0;
};

struct Base1 : Interface1
{
     virtual int getID() override { return 1; }
};

struct myClass: Interface2, Base1
{
    virtual int add(int a,int b) override { return a+b; }
};

int main()
{
    myClass c;    
    std::cout << c.add(0, 1) <<"
"
;
}

其思想是,myClassInterface2为基础,但使用Base1作为接口1的实现。当我编译此代码时,我得到以下错误:

1
getId is ambiguous.

我怎么修?


问题是,myClassInterface1继承了两次(一次从Interface1继承,一次从Base1继承),从而继承了两个纯虚函数(myClass::getIDBase1::getID。由于只实现了其中的一个,如果您尝试创建一个myClass对象,编译器会抱怨myClass是一个抽象类型。这是对的。

解决方案(除了使用更简单的继承)是使类实际上从Interface1继承:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

struct Interface1
{
    virtual int getID()=0;
};

struct Interface2 : virtual Interface1
{
    virtual int add(int a,int b)=0;
};

struct Base1 : virtual Interface1
{
     virtual int getID() override { return 1; }
};

struct myClass: Interface2, Base1
{
    virtual int add(int a,int b) override { return a+b; }
};

int main()
{
    myClass c;
    std::cout << c.getID() <<"
"
; // prints 1
}