接口继承和实现继承的区别

27
我在 Meyers 的书中找到了这两个术语,但它们有什么区别呢?
4个回答

29

接口继承是公共继承,而实现继承是私有继承。

如果类B公共继承自A,则B “是一个” A:它继承了A的整个接口,并且可以将B对象的(引用/指针)自动向上转换为A,并在任何期望A对象的地方使用。但是,如果B私有继承自A,则B“是以A为实现的”:只继承A的实现,而不是其接口。因此,B对象的(引用/指针)不能在期望A对象的地方使用。

更新

为了回应@Michal的评论,以下是一些链接(主要基于搜索“c++实现继承”),以展示这些术语在C++环境中的常见用法:


1
请注意,private继承应仅在非常有限的情况下使用(主要是:虚拟覆盖/空基类优化)。“基于实现”的关系最好通过组合实现。 - Matthieu M.

1

实现继承(或类继承)是指将基类中的公共实现部分分离出来。

接口继承是指使用虚方法。它旨在将接口与实现分离,并最小化程序元素之间的依赖关系。


1
你的陈述在几个方面都是不正确的:1)为了继承其实现,您无需在派生类中添加任何新字段/方法,2)在公共继承的情况下,默认情况下继承类的接口时,您不需要虚拟方法。 - Péter Török
更正1)以更精确的方式。我的定义得到了http://www.exforsys.com/tutorials/csharp/inheritance-in-csharp.html的支持。 - Michal Czardybon
请注意,C++语言甚至不包含“接口”这个概念 - 实际上它是作为一个只包含纯虚方法的类来实现的。 - Péter Török

1
主要区别在于接口是公共继承,而实现是私有继承。在公共继承中,公共和保护部分的数据成员和方法将从基类继承到派生类中的各自访问限定符。同时,派生类的对象可以像普通方法一样访问基类的数据成员。在私有继承中,公共和保护部分的数据成员和方法将以私有访问限定符从基类继承到派生类中。

0
这是根据《Taligent程序设计指南》介绍的两种继承类型之间的区别。
继承有两种形式:类型继承和实现继承。在这两种形式的继承中,派生类可以共享或覆盖从基类继承的行为。但是,仅在必要时使用类型继承,使得派生类也能继承类型信息。继承类型信息的主要原因是为了允许多态性。
通过从公共基类派生一个类来表示类型继承;通过从私有或受保护的基类派生一个类来表示实现继承。
更多信息请参见: https://root.cern/TaligentDocs/TaligentOnline/DocumentRoot/1.0/Docs/books/WM/WM_23.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接