kzhereb / knu-is-ooop2019

Materials for "Fundamentals of OOP" course
MIT License
3 stars 0 forks source link

T10.58. Чи бувають віртуальні конструктори? Чому? #58

Open yanaskyrda opened 4 years ago

i1red commented 4 years ago

Використання віртуальних конструкторів у С++ не передбачено, бо всі virtual методи зберігаються у таблиці віртуальних методів об'єкта, яка налаштовується саме при виклику конструктора

AntonHladkiy commented 4 years ago

C++ не передбачає використання віртуальних конструкторів, адже таблиця віртуальних методів ще не створена, отже конструктор повинен бути завжди не віртуальним

MarinaMontag commented 4 years ago

Питання про віртуальні конструктори є цікавим, оскільки в C ++ таких конструкторів не існує. "Віртуальний конструктор" - це скоріше патерн ООП, який легко реалізувати на C ++. Його ще називають фабричним способом. Віртуальний конструктор - це віртуальний метод, який визначає інтерфейс для створення деякого об'єкту, але залишає її реалізацію класам-нащадкам. Типове застосування цього патерну - це клонування об'єктів, тип яких невідомий на етапі компіляції. class A { public: virtual A *Clone() { return new A; } };

class B : public A { public: A *Clone() { return new B; } };

extern A ptr; / ми не знаемо, на який об'єкт посилаемось / ... A copy = ptr->Clone(); /створюємо копію об'єкта, не знаючи його точний тип /

У цьому прикладі Clone можна назвати віртуальним конструктором.

RostyslavMV commented 4 years ago

В С++ немає віртуальних конструкторів. Це неможливо, адже на момент його виклику немає об'єкту чи вказівника на нього.

tanyakurdelchuk commented 4 years ago

В C ++ немає такого поняття як віртуальний конструктор, який би збирав потрібний нам об'єкт в залежності від будь-яких вхідних параметрів на етапі виконання. Зазвичай для цих цілей використовується параметризрваний Factory Method.

ilyakorenevskyi commented 4 years ago

Конструктори не можуть бути віртуальними, ще немає таблиці віртуальних методів

Beam-of-Light commented 4 years ago

Ні, в С++ не бувають., адже ще немає таблиці віртуальних методів