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

时间:2012-02-22 23:27:02

标签: 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;
}

2 个答案:

答案 0 :(得分:11)

在您的类层次结构中,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();
}

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

答案 1 :(得分:1)

你的问题是由可怕的钻石继承引起的。您已实施TObjectA::IInterfaceA::MethodA但未IInterfaceB::IInterfaceA::MethodA

我的建议是让IIterfaceA和IIterfaceB完全独立。如果那是不可能的,你可以查看虚拟继承。