| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Запретить наследование |
| Автор: Fedor 17.6.2007, 12:25 |
| Не нашел такой темы... как в с++ запретить наследование класса? в .net эта штука, насколько я понимаю называется sealed. А как здесь? |
| Автор: Daevaorn 17.6.2007, 12:31 |
сделать конструкторы private. А для создания объекта написать "фабричный метод" |
| Автор: Fedor 17.6.2007, 12:46 | ||
типа
?? Добавлено через 4 минуты и 3 секунды Хотя так не пойдет... В общем, как это фабричный метод? ) |
| Автор: Xenon 17.6.2007, 13:07 | ||||
Я понимаю так.
Добавлено через 1 минуту и 53 секунды Ну или так:
|
| Автор: Feniksa 17.6.2007, 13:45 |
| Fedor, а какой компилятор используеш? |
| Автор: Damarus 17.6.2007, 14:04 | ||
|
| Автор: Xenon 17.6.2007, 14:18 |
| Если комилятор для C#, то можно приписать sealed? |
| Автор: Damarus 17.6.2007, 15:47 |
Ну, так не интересно. Если тема в разделе C++, то и компиляторы должны быть для С++. |
| Автор: Xenon 17.6.2007, 15:48 |
| Damarus, ну это был риторический вопрос автору идеи |
| Автор: Fin 17.6.2007, 15:56 |
| Вопрос на засыпку: Назовите внятную и вескую причину, Зачем нужно запрешать наследование? Тем самым нарушая основной принцип ООП. |
| Автор: Xenon 17.6.2007, 16:14 |
| Fin, какой принцип? Где написано, что все классы должны иметь способность к классическому наследованию? |
| Автор: Fin 17.6.2007, 17:23 |
| Xenon, Открой любой учебник, где хотя бы краем упоминается Объектно Оринтированное Программирование. Там обязательно будут упоменены три кита ООП: инкапсуляция, наследование и полиморфизм. |
| Автор: skyboy 17.6.2007, 17:30 |
| Fin, давай без фанатизма, а? то, что аксиоматическим началом эвклидовой геометрии является непересекаемость параллельных прямых вовсе не означает, что все прямые должны быть параллельны |
| Автор: Fin 17.6.2007, 17:58 |
| Ну я так и не услышал причину? Или запретить ради запрешения |
| Автор: Xenon 17.6.2007, 18:04 |
| Fin, открыл, ну и? Да, согласен, в ООП есть и инкапсуляция и полиморфизм и наследование ... Что, я теперь в каждом классе должен все функции помечать как virtual, приватные члены делать защищенными? А, ну тогда еще нельзя использовать friend, так как друзья - палки в колеса настоящему ООП. Свою очередь могу посоветовать открыть Страуструпа на 23 главе "Разработка и проектирование" |
| Автор: archimed7592 17.6.2007, 18:31 |
| Fedor, лучше запретить деструктор - тогда будет класс как класс, но без возможности наследования. Fin, поверь, причины бывают... как правило архитектурные. Добавлено через 1 минуту и 6 секунд эээ... хотя, туплю... класс как класс не буит... |
| Автор: skyboy 17.6.2007, 18:33 |
| Fin, не знаю, быть может, мой пример - ошибка проектирования...Кроме того, не знаю, возможен ли такой поворот событий в С++(пример пришел из опыта программирования на Delphi) были у меня объекты. реально конструируемые. а потом возникла потребность скрыть конструктор и сделать фабричный метод, чтоб предотвратить создание логически одинаковых объектов. И вот занаследует человек мой класс(ещё вопрос - зачем) и в своем конструкторе сделает вызов... моего фабричного метода. И фабричный метод найдет подходящий объект и увеличит его счетчик ссылок, или не найдет и создаст новый объект, который канет в бездну... В любом случае, человек со своим наследником моего класса не получит то, чего ожидал - вызов конструктора предка для дополнительной инициализации. Можно, конечно, раскомментировать случаи использования как только можно. Но безопасней было бы запретить наследование. И, если ему(клиенту) надо будет - пусть делает композицию с моим объектом. В общем, как на меня, запрет наследования был бы "в кассу" если необходимо предотвратить работу с фабричными методами вместо обычных конструкторов P.S. Кидайте помидоры, мне даже интересно, где ошибся при проектировании |
| Автор: MAKCim 17.6.2007, 18:34 | ||
|
| Автор: MAKCim 19.6.2007, 12:34 |
| Товарищи, чем вас не устраивает мой вариант? |
| Автор: Xenon 19.6.2007, 12:43 |
| MAKCim, в принципе неплохо, но по-моему не очень очевидная реализация |
| Автор: Vyacheslav 19.6.2007, 13:04 |
А виртуальное наследование то зачем, если предполагается, что от класса A унаследовать больше нельзя? |
| Автор: MAKCim 19.6.2007, 13:06 |
| Vyacheslav, а если комментарии прочитать |
| Автор: Xenon 19.6.2007, 13:07 |
| Vyacheslav, без виртуального наследования производные классы от A можно будет строить |
| Автор: Vyacheslav 19.6.2007, 13:08 |
| Вопрос снят |
| Автор: MAKCim 19.6.2007, 13:08 |
зато действенная и объекты класса A можно без напряга создавать |
| Автор: archimed7592 19.6.2007, 14:58 |
| MAKCim, минус твоей реализации: оверхэд из-за виртуального наследования. Ну это так - для общей картины |
| Автор: math64 19.6.2007, 15:00 | ||
Компилирется gcc без ошибок |
| Автор: Daevaorn 19.6.2007, 15:04 |
Добавь конструкторы или явно инстанцируй C |
| Автор: MAKCim 19.6.2007, 17:04 | ||
есть вариант лучше? |
| Автор: archimed7592 19.6.2007, 17:10 |
MAKCim, я же специально сказал: Можно сделать как у тебя и поиметь удобство(+) и оверхэд(-). Можно сделать иначе и поиметь неудобство(-) и скорость(+). Смотря что критичней - зависит от ситуации. Лучших решений не бывает. Бывают рациональные. |
| Автор: MAKCim 19.6.2007, 17:37 | ||||||||
надо бы проверить насколько мой вариант уступает в скорости (если вообще уступает) если использовать static функцию + new
то однозначно мой вариант быстрее в случае статических объектов
и немного уступает в случае динамического создания
засчет дополнительного создания объекта класса B, но класс B - пустой и при достаточной оптимизации подобъект этого класса вообще можно не создавать |