Типы детских классов - PullRequest
       9

Типы детских классов

0 голосов
/ 06 сентября 2010

У меня есть вопрос, какой тип применяется ко всем языкам со статической типизацией и некоторым видом ООП.

Если у меня есть класс A, класс B, который является дочерним для A, и класс C, который является дочерним для B и переменной типа A, могу ли я хранить в нем также экземпляры B и C?

Ответы [ 3 ]

6 голосов
/ 06 сентября 2010

В Delphi ответ - да.

Например, я создал компонент текстового редактора с подсветкой синтаксиса. Этот компонент имеет свойство FormattingProcessor, которое имеет тип TFormattingProcessor. Теперь я создал несколько процессоров форматирования, например, TXMLFormattingProcessor, TPascalFormattingProcessor и TINIFormattingProcessor, каждый класс является потомком TFormattingProcessor. Любой из них может быть назначен свойству FormattingProcessor компонента текстового редактора.

То есть переменной, объявленной как TFormattingProcessor, может быть присвоено значение типа TXMLFormattingProcessor, TPascalFormattingProcessor или TINIFormattingProcessor, например.

Если вы посмотрите в VCL, то увидите, что этот тип назначений на самом деле очень распространен. Например, компонент TLabel имеет свойство FocusControl, которое имеет тип TWinControl (если я правильно помню). Вы можете назначить любому потомку TWinControl это свойство, например, TEdit. (FocusControl - это элемент управления, который получит фокус клавиатуры, когда символ ускорителя надписи набирается вместе с клавишей Alt.)

4 голосов
/ 06 сентября 2010

В C ++ ответ - нет.Если бы тип был A* или A&, ответ был бы да, но только для A это не.

В Java, C # и других языках, где переменные являются ссылками на объекты по умолчанию,ответ - да.

1 голос
/ 06 сентября 2010

На этот вопрос нельзя ответить достоверно, не зная, какой тип наследования имеется в виду, когда вы говорите, что класс «B» является потомком «A» и где осуществляется доступ. Другими словами, не зная, является ли база доступной и однозначной, невозможно правильно ответить на этот вопрос.

$ 11.2 / 4 - «Базовый класс считается доступным, если доступен изобретенный открытый член базового класса.»

Предполагая, что «A» является однозначной и доступной базой «B», а «B» является однозначной и доступной базой «C», а «A», «B» и «C» являются конкретными классами ( нет чисто виртуальной функции)

B b;
C c;

A &rb = b;       // OK
A &rc = c;       // OK 

A *pb = &b;      // OK
A *pc = &c;      // OK

A a1 = b;        // sliced, only 'A' subobject of 'B' is copied onto 'a1', may be a logical error
A a2 = c;        // sliced, only 'A' subobject of 'C' is copied onto 'a2', may be a logical error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...