Разделите 17.4.1.2 из стандарта C++, абзаца 4, указывает что:
"В Библиотеке Стандарта C++, однако, объявления и определения (за исключением имен, которые определяются как макросы в C) в объеме пространства имен (3.3.5) из станд. пространства имен",
Это включает объекты, найденные в заголовки шаблона cname, включая cstddef, который определяет size_t.
Так станд.:: size_t на самом деле корректен.
В большинстве языков программирования, 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
и т. Д.) Создаются путем вызова виртуального конструктора на метатип.