Фінальний клас — це ідіома проектування, яка полягає в ідеї, що від класу, який ми у цьому випадку робимо "фінальним", не можна успадковуватися.
Значення Частково симулює final функція класу. Частково або повністю запобігти успадковування від класу.
Також відомий, як
Sealed Class
Мотивація Можлива ситуація, коли розробники захочуть обмежити наслідування чи розширення функціональності класу користувачем. У різних мовах програмування ця функціональність забезпучується. Наприклад у Java ключове слово - final, тоді коли у C# це - sealed. Ідіома Final Class реалізує цю можливість у С++.
Solution та приклад коду Ідіома Final class робить використання віртуального наслідування і дружнього класу, щоб продекламувати ефект фінального класу. Ідіома залежить від одного з правил С++: конструктор (та деструктор) унаслідуваного класу визиваються безпосередньо нащадком. Якщо доступ до конструктора чи деструктора запобігається, то клас не може мати нащадків.
class MakeFinal { MakeFinal() {} // private by default. friend class sealed;
class sealed : virtual MakeFinal
class test : public sealed
int main (void) { test t; // Compilation error here. }
У наведеному прикладі клас test наслідується від sealed-класу, а main функція намагається створити екземпляр класу test. Створення провалюється, оскільки клас test не може отримати доступ до приватного деструктора класу MakeFinal тому що він визначений як private та є предком test.
Зауважте, що ця помилка виникає лише тоді, коли клас test є нащадком від MakeFinal. Компілятор не буде скаржитися доки клас test виконується, не наслідуючи sealed-клас.
Примітки