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