Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/48: Рейтинг темы: голосов - 48, средняя оценка - 4.88
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89

Класс, который невозможно наследовать

16.03.2012, 00:54. Показов 9115. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2012, 00:54
Ответы с готовыми решениями:

От класса String наследовать новый класс, который имеет проверку на превышение размера строки
Доброго времени суток! Решаю задачи из учебника Роберта Лафоре ООП в C++. До этой задачи все решал сам и успешно, а тут встал в...

Наследовать базовый класс
Наследовать базовый класс,в котором переопределить оператор ввода данных >> и реализовать ввод всех данных для синтеза через текстовый...

Можно-ли наследовать класс, в котором определен объект текущего класса?
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B : public A {};

8
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.03.2012, 00:57
Лучший ответ Сообщение было отмечено как решение

Решение

в С++11 есть final
http://www2.research.att.com/~... html#final
http://en.wikipedia.org/wiki/C... _and_final
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.03.2012, 00:59
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
так его потомков просто нельзя будет создавать
запретить наследовать нельзя
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
16.03.2012, 01:04
Лучший ответ Сообщение было отмечено как решение

Решение

Специальной конструкции запрета в языке нет. Но народ изощрялся и придумал "финальный" класс. Посмотри — может поможет.

Виртуальное наследование позволяет нам запретить наследование от нашего класса. О том, что это не просто интересная «фишка», а реально необходимая возможность, говорит тот факт, в Java введено специальное ключевое слово final. Если класс объявлен как final, то пользователь не сможет от него наследовать. Класс String в библиотеке классов Java объявлен как финальный.

В С++ нет специальных ключевых слов, запрещающих наследование, поэтому объявление класса «финальным» основано на управлении доступом к специальным функциям класса: конструкторам и деструктору. Например, если объявить в базовом классе закрытым деструктор, то будет невозможно объявить переменную-объект ни базового класса, ни производного класса, например

C++
1
2
3
4
5
6
7
class OnlyDynamic
{ ~OnlyDynamic();
    public: 
// …
};
class Derived: public OnlyDynamic
{ };
Наследование формально не запрещается, однако попытки объявить переменную

C++
1
Derived Object;                // ошибка!
вызывают ошибку компиляции. Однако такое определение базового класса не мешает нам создавать наследника в динамической памяти, например

C++
1
2
Derived *p = new Derived;
delete p;
Как пишет Б.Страуструп в [43], Эндрю Кениг обнаружил, что можно «запретить» наследование (а фактически — создание объектов класса-наследника), используя виртуальное наследование. Простейший пример выглядит так (листинг 12.7):

C++
1
2
3
4
5
6
7
8
9
10
11
12
Листинг 12.7. Финальный класс
class Lock                                // «запирающий» класс
{ Lock();
  Lock(const Lock&);
  friend class Usable;
public:
};
class Usable: public virtual Lock        // «финальный» класс
{ public:
  Usable() { cout << "Usable!"; }
};
class Derived: public Usable {};        // формально не запрещено
В этом случае мы имеем «внутреннюю» иерархию из двух классов:
- запирающий класс — виртуальная база, у которого конструкторы являются приватными;
- виртуальный наследник — финальный класс, от которого нельзя наследовать.
Хотя формально наследование не запрещено, попытки создать объект класса Derived оканчиваются неудачей на этапе трансляции.

C++
1
2
3
Usable u;                                // нет ошибки
Derived d;                                // ошибка трансляции
Derived *pd = new Derived;                // ошибка трансляции
Для объектов типа Derived выдается сообщение об отсутствии доступа к приватным конструкторам класса Lock.
5
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 01:06  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
в С++11 есть final

Если бы я еще английский знал
И про ключевое слово final в С++ тоже интересно.
На русском хоть в двух словах где-то есть?
0
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
16.03.2012, 01:10
http://cppnl.blogspot.com/2010/07/final-class.html
1
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 01:48  [ТС]
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Однако такое определение базового класса не мешает нам создавать наследника в динамической памяти
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class OnlyDynamic 
{
    ~OnlyDynamic(){std::cout<<"~Base()\n";}
};
class Derived: public OnlyDynamic 
{
public:
    ~Derived(){std::cout<<"~Derived()\n";}
};
 
int main()
{
    Derived *p = new Derived();
    delete p;
}
Мешает
Хотя и прикольно
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
16.03.2012, 01:55
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
ну и объекты класса не создать
правда можно переопределить new и создавать динамически

Добавлено через 1 минуту
а главное Зачем?
0
 Аватар для Konstantin_D
15 / 15 / 6
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:07  [ТС]
C++
1
Usable u;
Тоже дает ошибку трансляции:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class Lock                          // «запирающий» класс
{ 
    Lock();
    Lock(const Lock&);
    friend class Usable;
};
class Usable: public virtual Lock   // «финальный» класс
{ 
public:
    Usable() { std::cout << "Usable!\n"; }
};
class Derived: public Usable {}; 
 
int main()
{
    Usable u;       // ТОЖЕ ОШИБКА ТРАНСЛЯЦИИ
//  Derived d;                  // ошибка трансляции
//  Derived *pd = new Derived();// ошибка 
}
Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а главное Зачем?
Не знаю. Я на собеседовании у них завтра спрошу зачем им это
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2012, 02:07
Помогаю со студенческими работами здесь

Класс, полиморфизм (Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат)
Задача. Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат. Вообщем-то ни...

Наследовать класс Button
Помагите сделать, надо наследовать класс Button, и внести такие изменения, когда создавал элемент кнопка автоматически называл...

Как наследовать класс activity
Написал класс activity1 в котором программно создан layout1. Как использовать мой класс в новом создаваемом приложении? какой нужен...

Как наследовать класс от System.Object
Господа, подскажите дураку, как наследовать класс от System.Object? На код: class A : public System.Object{}; выдает ошибку

Может ли класс наследовать от нескольких классов
Может ли класс наследовать от нескольких классов? И если да, то как?). Мне надо повторяющиеся свойства из разных классов вырвать)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru