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

sys*_*rpl 10 c++ inheritance multiple-inheritance

我正在尝试使用抽象类在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;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 12

在类层次结构中,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();
}
Run Code Online (Sandbox Code Playgroud)

是否需要这种复杂的类层次结构是另一回事.