c++ - 使用继承的具体类在 C++ 中实现接口(interface)

标签 c++ inheritance multiple-inheritance

我正在尝试使用抽象类在 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/

相关文章:

javascript - 在对象实例化期间扩展 javascript 对象

C++:构造函数:父类参数和新实例中的设置值

c++ - std::deque、引用和 'pop'

ruby - 在运行时继承一个新的类方法

c++ - 实现具有多重继承的纯虚函数

c++ - 继承自具有相同成员的两个 parent

c++ - 多重继承 : same variable name

c++ - DirectX11 纹理坐标和顶点

c++ - 为 C++ CGI 实现缓存数据

c++ - 类的构造函数是返回类类型的引用还是只是一 block 内存?