用继承的具体类在C++中实现接口
Implementing interfaces in C++ with inherited concrete classes
我正试图使用抽象类在C++中定义接口类型,并用具体类实现它们。我遇到的问题是,我不能从另一个接口继承和接口,也不能从一个基类继承实现。
我的目标是能够定义一个接口层次结构,它可以继承不太复杂的基本接口。我还希望能够通过从具体类继承来扩展接口的实现(就像下面例子中从TObjectA继承一样)。
这就是我所拥有的。我得到的错误是"不允许使用抽象类类型为"TObjectB"的对象"。我相信我知道为什么,那是因为我没有在TObjectB中实现MethodA()。但我真正想要的是实现由基类(TObjectA)提供,并且仍然具有接口层次结构(IInterfaceB继承自IInterfaceA)。我也不想在派生的concreate类中重复所有继承的接口方法。我该怎么做?
class IInterfaceA
{
public:
virtual void MethodA() = 0;
};
class IInterfaceB : IInterfaceA
{
public:
virtual void MethodB() = 0;
};
class TObjectA : public IInterfaceA
{
public:
void MethodA() { cout << "Method A"; }
};
class TObjectB : public TObjectA, public IInterfaceB
{
public:
void MethodB() { cout << "Method B"; }
};
void TestInterfaces()
{
IInterfaceB* b = new TObjectB(); // error: object of abstract class type "TObjectB" is not allowed
b->MethodB();
delete b;
}
在类层次结构中,TObjectB
实际上有两个IInterfaceA
基类子对象:一个通过IInterfaceB
继承,另一个通过TObjectA
继承。需要实现它们中每一个的MethodA()
。
您需要使用公共虚拟继承从接口类继承,这确保了每个接口类类型只有一个基类子对象:
class IInterfaceA
{
public:
virtual void MethodA() = 0;
};
class IInterfaceB : public virtual IInterfaceA
{
public:
virtual void MethodB() = 0;
};
class TObjectA : public virtual IInterfaceA
{
public:
void MethodA() { cout << "Method A"; }
};
class TObjectB : public TObjectA, public virtual IInterfaceB
{
public:
void MethodB() { cout << "Method B"; }
};
void TestInterfaces()
{
TObjectB b_object;
IInterfaceB& b = b_object;
b.MethodB();
}
这种复杂的类层次结构是否可取完全是另一回事。
您的问题是由可怕的钻石继承引起的。您已经实现了TObjectA::IInterfaceA::MethodA
,但没有实现IInterfaceB::IInterfaceA::MethodA
。
我的建议是使IIterfaceA和IIterfaceB完全独立。如果这不可能,您可以研究虚拟继承。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的