c++ - 指向组合接口(interface)的指针 - 指向实现一个接口(interface)并从另一个接口(interface)的实现扩展的类

标签 c++ inheritance interface multiple-inheritance

我有两个接口(interface):

class FirstInterface
{
    virtual int getId() const = 0;
};

class SecondInterface
{
    virtual void setId(int id) = 0;
};

这是一个组合界面:

class CombinedInterface : public FirstInterface, public SecondInterface
{

};

这是第一个接口(interface)的具体类:

class FirstConcrete : public FirstInterface
{
    virtual int getId() const
    {
        return 1;
    }
};

现在,这个类 CompleteConcrete 应该有 CombinedInterface 但同时想重用 FirstConcrete 的实现。

class CompleteConcrete : public FirstConcrete, public SecondInterface
{
    virtual void setId(int id) { }
};

// This is wrong C++
// Cannot convert from CompleteConcrete * to CombinedInterface *
// CombinedInterface * combinedInterface = new CompleteConcrete();

这当然行不通。 有人知道用 C++ 实现这个目标的方法吗??

最佳答案

这是我在评论中提到的基于虚拟继承的解决方案:

class FirstInterface
{
    virtual int getId() const = 0;
};

class SecondInterface
{
    virtual void setId(int id) = 0;
};


class CombinedInterface : virtual public FirstInterface,
              virtual public SecondInterface
{

};

class FirstConcrete : virtual public FirstInterface
{
    virtual int getId() const
    {
        return 1;
    }
};

class CompleteConcrete : virtual public FirstConcrete,
             virtual public CombinedInterface
{
    virtual void setId(int id) { }
};

void example()
{
    CombinedInterface * combinedInterface = new CompleteConcrete();
}

使用虚拟继承,唯一需要的改变(除了房间里的大象)是 CompleteConcreteCombinedInterface 乘法继承, 而不是 SecondInterface .你可以这样想:with CompleteConcreate图中,现在支持CombinedInterface ,而不仅仅是添加 SecondInterface .

有些人不赞成虚拟继承。我不。这是 C++ 的独特功能之一,其他高级语言无法共享,TMK。它是一个非常强大的工具,可以解决某些用其他方法难以解决的问题。虚拟继承的两个主要缺点是:

  1. 因为它太强大了,所以很容易被误用,导致各种问题。

  2. 如果虚拟继承的类具有非默认构造函数,它很快就会变得痛苦,因为每个虚拟继承某些东西的类现在都负责构造它。

但只要正确使用虚拟继承,并且所涉及的类可以自行构建,虚拟继承是一个有用的工具。

附言我还会提到刚刚想到的另一个替代解决方案。如果,说你有你的 CombinedInterface只是为了某些特定功能可能需要它,例如:

 void somefunction(CombinedInterface &object);

您的函数需要一个组合接口(interface)。

做一个小改动:

 void somefunction(FirstInterface &first, SecondInterface &second);

并传递相同的对象作为两个参数。你可以通过CompleteConcrete ,它实现了这两个接口(interface),而不会对您的类层次结构进行任何更改。你也可以有一个模板外观,让它看起来像函数仍然需要一个参数:

template<typename T> void somefunction(T &&t)
{
    real_somefunction(std::forward<T>(t), std::forward<T>(t));
}

void real_somefunction(FirstInterface &first, SecondInterface &second);

你几乎可以摆脱 CombinedInterface , 并简单地将实现这两​​个接口(interface)的任何对象传递给 somefunction() ,还有你的 real_somefunction()将使用一个或另一个参数来调用适当的接口(interface)。

假设您需要携带一个指向实现这两个接口(interface)的对象的指针?

class combined_pointer : public std::pair<FirstInterface *, SecondInterface *> {

public:
    template<typename T> combined_pointer(T *t)
            : std::pair<FirstInterface *, SecondInterface *>(t, t)
    {}
};

只是一个起点。

关于c++ - 指向组合接口(interface)的指针 - 指向实现一个接口(interface)并从另一个接口(interface)的实现扩展的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41411126/

相关文章:

c++ - 从另一个文件调用一个函数到另一个函数C++

C++ 无法使用父类(super class)的方法?

c++ - 有没有办法在 Windows 上测量精确到微秒的时间?

c++ - 读写类 vector

javascript - 我想克隆一个 javascript 类。向克隆属性添加方法而不实际覆盖现有方法?

interface - 使用具有显式接口(interface) : Sometimes it compiles, 的外部过程的类型绑定(bind)过程有时不

c++ - QExplicitlySharedPointer 和继承

java - Java中的基本多态性/将父类(super class)转换为子类

go - 为什么返回具体类型不满足需要接口(interface)返回的接口(interface)

提取公用表定义的算法?