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