我正在尝试使用抽象类在 C++ 中定义接口(interface)类型并使用具体类实现它们。我遇到的问题是我不能既从另一个接口(interface)继承和接口(interface),又从一个具体的基类继承实现。
我的目标是能够定义接口(interface)的层次结构,这些接口(interface)可以继承自不太复杂的基础接口(interface)。我还希望能够通过从具体类继承来扩展接口(interface)的实现(如下例中从 TObjectA 继承)。
这是我的。我收到的错误是“不允许抽象类类型“TObjectB”的对象”。我相信我知道为什么,这是因为我没有在 TObjectB 中实现 MethodA()。但我真正想要的是由基类 (TObjectA) 提供的实现,并且仍然具有接口(interface)层次结构(IInterfaceB 继承自 IInterfaceA)。我也不想在派生的 concreate 类中重复所有继承的接口(interface)方法。我该怎么做?
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()
。
您需要使用公共(public)虚拟 继承从接口(interface)类继承,这确保每个接口(interface)类类型只有一个基类子对象:
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();
}
是否需要这种复杂的类层次结构完全是另一回事。
关于c++ - 使用继承的具体类在 C++ 中实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404884/