我最近听到我的一位同事声称 C++ 中没有定义“子类型”的概念。他声称“子类型”在 C++ 术语中被正确地称为“派生类型”。这是真的?如果我有:
class A { };
class B : public A { };
我可以称 B 为 A 的子类型吗?还是仅在 C++ 中将 B 称为 A 的“派生类型”才有效?
我最近听到我的一位同事声称 C++ 中没有定义“子类型”的概念。他声称“子类型”在 C++ 术语中被正确地称为“派生类型”。这是真的?如果我有:
class A { };
class B : public A { };
我可以称 B 为 A 的子类型吗?还是仅在 C++ 中将 B 称为 A 的“派生类型”才有效?
子类型不是 C++ 中常用术语的一部分。Wikipedia 中的定义(感谢 Chad)非常广泛,在 C++ 中可以表示多种不同的事物,包括但不限于继承。例如,给定类别和指针的所有迭代器类型都可以是迭代器概念的子类型,因为它们可以在需要该概念的模板中替换(包括标准库算法)。
我一般会使用派生,其他相同的替代词(在不同的语言中)可以包括extends(类型 A 扩展 B)或inherits。
子类型是类型的特殊版本。在 C++ 中,派生类是基类类型的子类型(子类)。派生类型的变量可以出现在请求父类型变量的任何地方。另一种类型的子类型意味着您可以在可以使用父类型的所有情况下使用子类型。
来自MSDN:
派生类型是可以在程序中使用的新类型,可以包括直接派生类型和组合派生类型。
根据维基百科:
如果 S 是 T 的子类型,则子类型关系通常写作 S <: T,这意味着任何类型 S 的术语都可以安全地用于预期类型 T 的术语的上下文中。
此定义意味着公共继承适用于以下类:
class T {};
class S : public T {};
但是,C++ 也提供private
和protected
继承,并且这些没有模拟继承所做的“is-a”关系,public
因此这些继承类型不符合子类型的定义(如维基百科提供的那样)。
子类型不是 C++ 中描述这些关系的常用方式,即使在定义看起来确实适合(public
继承)的情况下也是如此。
Stroustrup 似乎更喜欢“派生类”,但也将其称为“子类”:请参阅此链接。
在http://www.stroustrup.com/hopl2.pdf他写道,
派生类概念是 Simula 的前缀类概念的 C++ 版本,因此是 Smalltalk 的子类概念的兄弟。选择派生类和基类的名称是因为我不记得什么是 sub 什么是 super 并且观察到我不是唯一一个遇到这个特殊问题的人。