8K wrote:Неужели нельзя "запечатать" класс собственными средствами С++? Не верю.
А как интересно? Можно конечно не использовать виртуальных функций и protected членов (о чем уже упоминалось) и тогда от наследования не будет особого толку, хотя сама возможность и будет присутствовать. Как запретить наследование от данного класса - разве что сделать все конструкторы приватными и создавать обьекты статической функцией?
class MySealedClass: private virtual Final { public: MySealedClass(): Final(0) {}; /* your code */ };
class MyDerivedClass: public MySealedClass { };
Хотя этот код скомпилируется, при попытке создать переменную типа MyDerivedClass компилятор пошлет нас подальше. Говорят, такой вопрос даже на интервью бывает
8K wrote:Неужели нельзя "запечатать" класс собственными средствами С++? Не верю.
А как интересно? Можно конечно не использовать виртуальных функций и протецтед членов (о чем уже упоминалось) и тогда от наследования не будет особого толку, хотя сама возможность и будет присутствовать. Как запретить наследование от данного класса - разве что сделать все конструкторы приватными и создавать обьекты статической функцией?
Хотя этот код скомпилируется, при попытке создать переменную типа МыДериведЦласс компилятор пошлет нас подальше. Говорят, такой вопрос даже на интервью бывает
Шо-шо? А если самому попробовать откомпилить и переменную создать?
A. Fig Lee wrote:Мне расскажите как работает - мне непонятно. Ни сразу, ни потом.
Мне тоже непонятно было сразу.
[q=Страуструп Б., Язык программирования С++, 3 издание, 15.2.4.1]
Конструктор виртуального базового класса вызывается (явно или неявно) из конструктора объекта (конструктора самого "нижнего" производного класса).
[/q]
uncle_Pasha wrote:Если класс не задумывался как базовый, почему бы не использовать struct?
Так ведь объявление типа через struct не запрещает наследование.
Оно объясняет смысл данного элемента данных. 99% что никому не прийдет в голову наследоваться от struct в дальнейшем
Неужели нельзя "запечатать" класс собственными средствами С++? Не верю.
А как интересно? Можно конечно не использовать виртуальных функций и protected членов (о чем уже упоминалось) и тогда от наследования не будет особого толку, хотя сама возможность и будет присутствовать. Как запретить наследование от данного класса - разве что сделать все конструкторы приватными и создавать обьекты статической функцией?
На самом деле, даже не наследование запрещать надо, а удаление через указатель на базовый класс.
А для этого достаточно сделать _невитруальный_ деструктор protected.
A. Fig Lee wrote:Мне расскажите как работает - мне непонятно. Ни сразу, ни потом. :мргреен: :мргреен:
Мне тоже непонятно было сразу. [q=Страуструп Б., Язык программирования С++, 3 издание, 15.2.4.1] Конструктор виртуального базового класса вызывается (явно или неявно) из конструктора объекта (конструктора самого "нижнего" производного класса). [/q]
Успехов!
Оооо..! Теперь мне понятно, что вам неправильно понятно. Виртуальный класс - ну и ? Наследовать то я все равно могу. Да, нельзя сделать обьект оф деривед класс ЕСЛИ КАК МИНИМУМ 1 ОБЙЕКТ парента УЖЕ присутствует в системе. Но ето НИКАК не запрещает мне наследовать свои классы.
uncle_Pasha wrote:Если класс не задумывался как базовый, почему бы не использовать струцт?
Так ведь объявление типа через струцт не запрещает наследование.
Оно объясняет смысл данного элемента данных. 99% что никому не прийдет в голову наследоваться от струцт в дальнейшем
Неужели нельзя "запечатать" класс собственными средствами С++? Не верю.
А как интересно? Можно конечно не использовать виртуальных функций и протецтед членов (о чем уже упоминалось) и тогда от наследования не будет особого толку, хотя сама возможность и будет присутствовать. Как запретить наследование от данного класса - разве что сделать все конструкторы приватными и создавать обьекты статической функцией?
На самом деле, даже не наследование запрещать надо, а удаление через указатель на базовый класс.
А для этого достаточно сделать _невитруальный_ деструктор протецтед.
Ну все, дожились. За что боролись, на то и напоролись. Страуструп думал-думал всюночь, наверное. Придумал. Пришел Вовка и все почикал. Ееее... Есь такой хороший язык - С называется или Ява - там тоже много чего почикано. Рекомендую.