在 C++ 中使用多继承声明接口并实现接口

Posted

技术标签:

【中文标题】在 C++ 中使用多继承声明接口并实现接口【英文标题】:Declare interface and Implement the interface using multi-inheritance in 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 是一个抽象类。当你有一个抽象基类时,你必须在你的派生类中实现函数。 有类似的东西:***.com/questions/860339/… @remyabel 谁告诉你的?您不必实现所有这些(甚至不是一个)。结果只是另一个抽象类。当你尝试实例化一个类时,它不能是抽象的,因此那个类需要实现所有的抽象函数。 已经用这个Possible Duplicate关闭了这个。重新打开以供其他人参考。版主可能会再次关闭它。 【参考方案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 将合并为一个(这就是虚拟继承的用途,基本上,它也称为钻石继承)。

【讨论】:

以上是关于在 C++ 中使用多继承声明接口并实现接口的主要内容,如果未能解决你的问题,请参考以下文章

Java的多接口实现到底有啥好处?

JAVA里 实现和继承的区别 说白话点 谢谢

Java中 支持多继承吗?

JAVA-初步认识-第九章-接口-多实现

002-多线程实现方式threadrunnablecallalethread和runnable对比

Java知识29 接口多测师