我正在尝试使用抽象类在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;
}
答案 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完全独立。如果那是不可能的,你可以查看虚拟继承。