【问题标题】:Declare interface and Implement the interface using multi-inheritance in C++在 C++ 中使用多继承声明接口并实现接口
【发布时间】:2014-11-24 11:52:29
【问题描述】:

我想知道它可用于声明接口并使用多继承实现接口。

例如。

我为接口声明抽象类。

class Interface{
public:
    virtual int interf1(int a) = 0;
    virtual int interf2(char c) = 0;
};

为了实现这两个接口,我为每个接口定义了两个类,如下所示

class Implement1{
public:
    int interf1(int a){
        std::cout << a << a << std::endl;
        return 0;
    }
};

class Inplement2{
public:
    int interf2(char c){
        std::cout << c << c << c << std::endl;
        return 0;
    }
};

然后作为最后阶段,我定义了一个继承接口并实现所有类的类。

class Test : public Interface, public Implement1, public Inplement2{

};

当然,它没有被编译。

有没有办法构建这种功能?

实际上,我在努力使它像下面那样编译时找到了一些方法,但我不确定它是不是不会产生潜在错误的安全方法,即使现在它似乎可以工作,因为它是简单的代码。

class Test : public Interface, private Implement1, private Inplement2{
public:
    virtual int interf1(int a){
        return Implement1::interf1(a);

    };
    virtual int interf2(char c){
        return Inplement2::interf2(c);
    }
};

【问题讨论】:

  • 你了解C++中的私有继承是什么意思吗...
  • 在您的第一个示例中,Test 是一个抽象类。当你有一个抽象基类时,你必须在你的派生类中实现函数。
  • @remyabel 谁告诉你的?您不必实现所有这些(甚至不是一个)。结果只是另一个抽象类。当你尝试实例化一个类时,它不能是抽象的,因此那个类需要实现所有的抽象函数。
  • 已经用这个Possible Duplicate关闭了这个。重新打开以供其他人参考。版主可能会再次关闭它。

标签: c++ inheritance interface implements


【解决方案1】:

不,没有办法覆盖在基类中声明的虚函数,除非在从该基类派生的类中重新声明它。您需要像在最后一个示例中所做的那样声明(并定义)Test::interf1Test::interf2

这意味着通过继承提供实现的这种奇怪技巧没有任何优势。我会使用更直接的组合:

class Test : public Interface {
public:
    virtual int interf1(int a){
        return i1.interf1(a);
    }
    virtual int interf2(char c){
        return i2.interf2(c);
    }
private:
    Implement1 i1;
    Inplement2 i2;
};

另一种可能性是虚拟继承:

class Implement1 : public virtual Interface {
    // implement interf1 here
};
class Inplement2 : public virtual Interface {
    // implement interf2 here
};
class Test : public Implement1, public Inplement2 {
};

但如果没有充分的理由,我不会推荐这个。它增加了接口和实现之间的耦合,并且更有可能融化试图弄清楚哪些函数在哪里声明的人的大脑。

【讨论】:

  • 私有继承时不能用using 语句替换那些重新实现吗? using Implement1::interf1; 然后你不需要重复签名(除非我记得错误的语法)这是危险的部分(如果参数类型改变了怎么办?那么你的代码仍然可以编译,因为你重复了关键字virtual恕我直言是个坏主意)
  • @leemes:不, using 声明不声明覆盖,它只是使基类函数在派生类的范围内可访问。在现代 C++ 中,使用 override 来避免您描述的“危险”(尽管,由于基本函数是纯虚拟的,如果您没有覆盖它,无论您是否这样做,都会收到错误消息)。
【解决方案2】:

我建议两种选择。

1。拆分界面

定义两个接口,Interface1interf1 方法,Interface2interf2 方法。定义两个实现Implement1Implement2,它们继承自它们对应的(单个)接口。通过继承 Implement1Implement2 来组合它们。

问题是你不能有一个通用接口用作多态接口类型。

2。对接口使用虚拟继承

Live demo

保留您原来的 Interface 定义。这两个实现都应该实际上从接口派生:class Implement1 : virtual public Interface { ... };。然后,在组合这些实现时,不要再次从接口派生,而只是从您的两个实现派生。他们的超类Interface 将合并为一个(这就是虚拟继承的用途,基本上,它也称为钻石继承)。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2016-10-23
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多