1 Востаннє редагувалося incred (07.11.2013 07:04:53)

Тема: Віртуальні конструктори.

Таке питання: Чи треба робити в базовому класі функції-члени, що створюються компілятором за замовчуванням, віртуальними? Про деструктор я точно знаю, що так і чому. Як щодо конструктора і operator= ? Адже динамічний тип може вимагати, н-д, проініціалізувати вміст вказівника датою, що має належати derived-класу, а якщо конструктор не буде віртуальний, то й динамічного зв'язування не буде. Дякую.

2 Востаннє редагувалося koala (07.11.2013 07:33:28)

Re: Віртуальні конструктори.

Віртуальний конструктор в прямому сенсі - це маячня. Віртуальна функція обирається під час виконання програми залежно від типу об'єкта; яким чином може бути обрана функція на базі об'єкта, якого ще не існує? Мова може йти хіба що про патерн "Фабрика".
Що ж до оператора =, то поліморфізм (і ООП в цілому) працюють з посиланнями на об'єкти:

Base x=new Derived();
x->nonVirtualMethod();//Base::nonVirtualMethod
x->virtualMethod();//Derived::virtualMethod

якщо в нас є нединамічний об'єкт, то його тип заданий жорстко і про жоден поліморфізм не йдеться:

Derived x;
x.nonVirtualMethod();//Derived::nonVirtualMethod
x.virtualMethod();//Derived::virtualMethod

Відповідно

x=y;//x.operator=(y)

віртуально не спрацює. І взагалі, перевантаження операторів - це АТД, а не ООП.

Подякували: incred1

3

Re: Віртуальні конструктори.

Так, дякую, статтю прочитав, досить корисно.
Й дійсно, тут я помилявся, об'єкт базового НЕ є його наслідуючим, а тому про можливість використання останнього мови й бути не може.