用继承的具体类在C++中实现接口

Implementing interfaces in C++ with inherited concrete classes

本文关键字:C++ 实现 接口 继承      更新时间:2023-10-16

我正试图使用抽象类在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完全独立。如果这不可能,您可以研究虚拟继承。