如何从实现与其他接口共享的接口的 class 继承
How to inherit from a class that implement an interface which is shared with other interface
我有这个示例代码:
#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) << "\n";
}
想法是myClass
基于Interface2
,但使用Base1
作为Interface1的实现。当我编译此代码时,出现此错误:
getId is ambiguous.
我该如何解决?
问题是myClass
从Interface1
继承了两次(一次从Interface1
,一次从Base1
),从而继承了两个纯虚函数(myClass::getID
和 Base1::getID
)。由于只实现了其中一个,如果您尝试创建一个 myClass
对象,编译器会抱怨 myClass
是一个抽象类型。而且是对的。
解决方案(除了使用更简单的继承之外)是使您的 类 几乎继承自 Interface1
:
#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() << "\n"; // prints 1
}
我有这个示例代码:
#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) << "\n";
}
想法是myClass
基于Interface2
,但使用Base1
作为Interface1的实现。当我编译此代码时,出现此错误:
getId is ambiguous.
我该如何解决?
问题是myClass
从Interface1
继承了两次(一次从Interface1
,一次从Base1
),从而继承了两个纯虚函数(myClass::getID
和 Base1::getID
)。由于只实现了其中一个,如果您尝试创建一个 myClass
对象,编译器会抱怨 myClass
是一个抽象类型。而且是对的。
解决方案(除了使用更简单的继承之外)是使您的 类 几乎继承自 Interface1
:
#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() << "\n"; // prints 1
}