Не, нету в стандартном С++ виртуальных конструкторов (не уверен на 100 процентов, но, по-моему, даже в Борланде, да и в Микрософте такого расширения не имеется). Тому есть и причины (+)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено homekvn 29 ноября 2006 г. 15:16
В ответ на: букав многа ни асилил :) чего-то напишу, уж поможет или нет х.з. отправлено <font color=gray>yes</font> 29 ноября 2006 г. 14:13

Виртуальные конструкторы актуальны только тогда, когда мы можем создать ссылку на класс. В Дельфи это синтаксически описывается так:

Type TMyClass_Ref = class of TMyClass;

Создав переменную типа TMyClass_Ref, я могу присвоить ей любой из типов, который есть потомок класса TMyClass, включая и сам TMyClass. Например,

Var MyClass_Ref : TMyClass_Ref;

Далее где-то могу сделать так:

MyClass_Ref := TMyClass;

или

MyClass_Ref := TMyClassChild;

где TMyClassСhild - некий класс-потомок от TMyClassСhild. После этого я могу эту переменную переслать кому-то еще (например, некоему классу, созданному третьим лицом). И этот кто-то еще уже создаст экземпляр этого класса (или не создаст, или создаст 50 экземпляров этого класса). Создать экземпляр, имея ссылку на клсаа, можно, например, так:

Var SomeClass : TMyClass;

SomeClass = MyClass_Ref.Create(param1, param2, ...);

где Create - виртуальный конструктор класса TMyClass и всех его потомков.

В Си++, к сожалению, ссылок на классы нет. По своей сущности ссылка на класс - это указатель на VMT класса.

По поводу шаблонов повторюсь: шаблоны это по сути своей расширенный препроцессор. Они хороши тогда, когда на этапе компиляции известно, какие классы будут создаваться. Здесь заметим, что если в шаблон включен класс целиком (классический пример - list), то порожденные от него на этапе компиляции классы ListClass1 и ListClass2, определенные соответственно как list(.Class1.) ListClass1 и list(.Class2.) ListClass2, то они будут несовместимыми, т.е. нельзя будет породить указатель на класс, которому мы могли бы присвоить как экземпляры типа ListClass1, так и экземпляры типа ListClass2 (с возможностью вызывать виртуальные методы этих классов).

Примечание: здесь использованы обозначения "(." - левая угловая скобка; ".)" - правая угловая скобка. (Просто угловые скобки сайт проглатывает и не отображает их содержимое, несправедливо полагая, что это html-тег).

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
если прибавить четыре к четырём будет:


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание