Где виртуальные конструкторы используются?

Разделите 17.4.1.2 из стандарта C++, абзаца 4, указывает что:

"В Библиотеке Стандарта C++, однако, объявления и определения (за исключением имен, которые определяются как макросы в C) в объеме пространства имен (3.3.5) из станд. пространства имен",

Это включает объекты, найденные в заголовки шаблона cname, включая cstddef, который определяет size_t.

Так станд.:: size_t на самом деле корректен.

6
задан Xinus 17 September 2009 в 06:18
поделиться

1 ответ

В большинстве языков программирования, afaik, вы не можете найти виртуальные конструкторы. Какие переопределения виртуальных членов оцениваются во время выполнения после создания объекта, но в большинстве языков вам необходимо знать фактический класс при создании экземпляра. Поэтому виртуальные конструкторы не имеют смысла в этих языках.

В .NET вы можете получить аналогичное решение через отражение, то есть вы можете создать объект через экземпляр класса Type, который представляет объект, который вы хотите построить. А с общей поддержкой вы также можете достичь чего-то подобного, но это не виртуальные конструкторы.

Единственный язык программирования, с которым я работал, и который имеет настоящие виртуальные конструкторы, - это Delphi. В Delphi есть особый «тип метакласса», т.е. конкретная программная конструкция, представляющая метакласс (тогда как в .NET мета-класс, класс Type , является просто экземпляром обычного класса). Итак, если у вас есть класс с именем TMyClass - Соглашение об именах Deplhi;)

TMyClass : Class ...

Вы можете объявить метакласс следующим образом

TMyMetaClass : class of TMyClass

Теперь вы можете объявить переменную, имеющую TMyMetaClass type,

MyMetaClassVariable : TMyMetaClass
... 
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;

И вы можете создать новый экземпляр с помощью этой переменной

MyClassInstance := MyMetaClassVariable.Create();

Теперь MyMetaClassVariable может ссылаться на любой класс, который является либо TMyClass , либо его специализацией. Если конструктор объявлен виртуальным, тогда переменная будет построена с экземпляром этого конкретного класса.

Таким же образом вы можете объявить виртуальные статические методы в Delphi и вызывать их через экземпляр метакласса.

Так другой вопрос? Зачем они нам нужны? Что ж, в Delphi они решают некоторые из тех же проблем, что и класс Type в .NET, позволяя создавать объекты, имя класса которых вы не знаете во время разработки. Например, когда вы разрабатываете форму и добавляете кучу элементов управления, эти данные должны быть сериализованы дизайнером и десериализованы. Когда форма десериализуется, на самом деле считываются метатипы, и правильные экземпляры (будь то TextBox , ComboBox и т. Д.) Создаются путем вызова виртуального конструктора на метатип.

12
ответ дан 9 December 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: