在C+中实现接口+;使用继承的具体类 我试图用抽象类定义C++中的接口类型,并用具体类实现它们。我遇到的问题是,我不能从另一个接口继承和接口,也不能从一个具体的基类继承实现

在C+中实现接口+;使用继承的具体类 我试图用抽象类定义C++中的接口类型,并用具体类实现它们。我遇到的问题是,我不能从另一个接口继承和接口,也不能从一个具体的基类继承实现,c++,inheritance,multiple-inheritance,C++,Inheritance,Multiple Inheritance,我的目标是能够定义一个接口层次结构,它可以继承不太复杂的基本接口。我还希望能够通过从具体类继承来扩展接口的实现(如下面示例中从TObjectA继承) 这就是我所拥有的。我得到的错误是“抽象类类型的对象”TObjectB“不允许”。我相信我知道原因,这是因为我没有在TObjectB中实现MethodA()。但我真正想要的是由基类(TObjectA)提供实现,并且仍然具有接口层次结构(IInterfaceB从IInterfaceA继承)。我也不想在派生的concreate类中重复所有继承的接口方法。

我的目标是能够定义一个接口层次结构,它可以继承不太复杂的基本接口。我还希望能够通过从具体类继承来扩展接口的实现(如下面示例中从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;
}
II类接口A
{ 
公众:
虚拟void MethodA()=0;
}; 
II类接口B:I接口A
{ 
公众:
虚空方法b()=0;
}; 
类对象A:公共界面A
{ 
公众:

void MethodA(){cout在类层次结构中,
TObjectB
实际上有两个
IInterfaceA
基类子对象:一个是通过
IInterfaceB
继承的,另一个是通过
TObjectA
继承的

您需要使用公共虚拟继承从接口类继承,这确保每个接口类类型只有一个基类子对象:

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();
}
II类接口A
{ 
公众:
虚拟void MethodA()=0;
}; 
II类接口B:公共虚拟接口A
{ 
公众:
虚空方法b()=0;
}; 
类TObjectA:公共虚拟界面a
{ 
公众:

void MethodA(){cout您的问题是由可怕的钻石继承造成的。您已经实现了
TObjectA::IIinterfacea::MethodA
,但没有实现
IIinterfaceb::IIinterfacea::MethodA


我的建议是使iInterfaceA和iInterfaceB完全独立。如果不可能,您可以研究虚拟继承。

您需要虚拟基类。例如,当我使用您的代码时,我收到以下警告“警告:'TObjectB':通过支配继承'TObjectA::TObjectA::MethodA'。另外,当我将测试更改为使用堆分配的对象时,会出现运行时断言错误,执行停止:void TestInterfaces(){IInterfaceB*b=new TObjectB();b->MethodB();delete b;}如果您打算通过接口类以多态方式删除对象,则接口类必须具有虚拟析构函数。至于警告:避免复杂的继承层次结构。