在 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::interf1
和 Test::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。拆分界面
定义两个接口,Interface1
和interf1
方法,Interface2
和interf2
方法。定义两个实现Implement1
和Implement2
,它们继承自它们对应的(单个)接口。通过继承 Implement1
和 Implement2
来组合它们。
问题是你不能有一个通用接口用作多态接口类型。
2。对接口使用虚拟继承
Live demo
保留您原来的 Interface
定义。这两个实现都应该实际上从接口派生:class Implement1 : virtual public Interface ... ;
。然后,在组合这些实现时,不要再次从接口派生,而只是从您的两个实现派生。他们的超类Interface
将合并为一个(这就是虚拟继承的用途,基本上,它也称为钻石继承)。
【讨论】:
以上是关于在 C++ 中使用多继承声明接口并实现接口的主要内容,如果未能解决你的问题,请参考以下文章