- Так, вони однакові. Похідний клас, який не оголошує щось віртуальним, не заважає йому бути віртуальним. Насправді жоден спосіб (включаючи деструктор) не може бути віртуальним у похідному класі, якщо він був віртуальним у базовому класі. У> = C ++ 11 ви можете використовувати,
final
щоб запобігти його перевизначенню у похідних класах, але це не заважає йому бути віртуальним.
- Так, деструктор у похідному класі можна опустити, якщо він не має нічого спільного. І неважливо, віртуальний він чи ні.
- Я б опустив це, якщо це можливо. І я завжди використовую
virtual
ключове слово знову для віртуальних функцій у похідних класах з міркувань ясності. Люди не повинні пройти весь шлях до ієрархії успадкування, щоб з’ясувати, що функція є віртуальною. Крім того, якщо ваш клас можна скопіювати або перенести без необхідності декларувати власну конструкцію копії чи переміщення, оголошення будь-якого деструктора (навіть якщо ви його визначите як default
) змусить вас оголосити конструктори копіювання та переміщення та оператори присвоєння, якщо ви хочете їх, оскільки компілятор більше не буде вкладати їх вам.
Як невеликий момент для пункту 3. У коментарях зазначалося, що якщо деклактор не оголошений, компілятор генерує типовий (який все ще є віртуальним). І це за замовчуванням - це вбудована функція.
Вбудовані функції потенційно піддають більшу частину вашої програми змінам в інших частинах вашої програми та роблять двійкову сумісність спільних бібліотек складною. Крім того, посилене зчеплення може призвести до значної кількості перекомпіляцій перед певними видами змін. Наприклад, якщо ви вирішите, що дійсно хочете реалізацію для вашого віртуального деструктора, тоді кожен фрагмент коду, який його викликав, потрібно буде перекомпілювати. Тоді як якщо ви оголосили це в тілі класу, а потім визначили його порожнім у .cpp
файлі, ви б добре змінили його без перекомпіляції.
Моїм особистим вибором все одно було б опустити це, коли це можливо. На мій погляд, це захаращує код, і компілятор іноді може робити трохи ефективніші дії, використовуючи типову реалізацію над порожньою. Але існують певні обмеження, через які ви можете зробити вибір поганим.