Подтипы против производных типов в переполнении стека

Недавно я слышал, как один из моих коллег утверждал, что понятие «подтип» не определено в C ++. Он утверждает, что «подтипы» справедливо называются «производными типами» в терминологии C ++. Это правда? Если у меня есть:


class A { };
class B : public A { };

Могу ли я назвать B подтипом A? Или только допустимо называть B «производным типом» A в C ++?

1

Решение

Подтип не является частью общего жаргона в C ++. Определение в Википедии (спасибо Чаду) довольно широкое и в C ++ может представлять несколько разных вещей, включая, но не ограничиваясь, наследование. Например, все типы итераторов из данной категории и указатели могут быть подтипы концепции итератора, поскольку они могут быть заменены в шаблонах, которые требуют эту концепцию (включая стандартные библиотечные алгоритмы).

я хотел бы использовать полученный в общем, другие альтернативные слова для одного и того же (на разных языках) могут включать продолжается (тип А расширяет В) или наследуется.

2

Другие решения

Подтип — это специализированная версия типа. В C ++ производный класс является подтипом (подклассом) типа базового класса. Переменная производного типа может появляться везде, где запрашивается переменная родительского типа. Подтип другого типа означает, что вы можете использовать подтип во всех ситуациях, когда может использоваться родительский тип.

От MSDN:

Производные типы — это новые типы, которые могут использоваться в программе и могут
включают непосредственно производные типы и составные производные типы.

0

В соответствии с википедия:

Если S является подтипом T, отношение подтипа часто записывается как S <:
T означает, что любой термин типа S может безопасно использоваться в контексте
где срок типа T ожидается.

Это определение означает, что публичное наследование подходит для следующих классов:

class T {};
class S : public T {};

Тем не менее, C ++ также обеспечивает private а также protected наследование, и они не моделируют отношения «есть», которые public наследование соответствует, и поэтому эти типы наследования не соответствуют определению подтипа (как это предусмотрено в Википедии).

Подтип не является распространенным способом в C ++ для описания этих отношений, даже в тех случаях, когда определение кажется подходящим (public наследование).

0

Похоже, Страуструп предпочитает «производный класс», но также назовет его «подклассом»: см. эта ссылка.

В http://www.stroustrup.com/hopl2.pdf он пишет,

Концепция производного класса — это версия языка программирования с префиксом класса в Simula, и, следовательно,
Концепция подкласса Smalltalk. Имена производного класса и базового класса были выбраны потому, что я
никогда не мог вспомнить, что было саб, а что было супер и заметил, что я не единственный
с этой конкретной проблемой.

0
По вопросам рекламы [email protected]