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)
是否需要这种复杂的类层次结构是另一回事.
| 归档时间: |
|
| 查看次数: |
7240 次 |
| 最近记录: |