Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 00:54     Класс, который невозможно наследовать #1
Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 00:54     Класс, который невозможно наследовать
Посмотрите здесь:

Класс который рисует на экране звезду C++
C++ Написать класс, который создает и выводит массив
C++ Можно-ли наследовать класс, в котором определен объект текущего класса?
Хелп! родовой класс, который реализовывал бы очередь C++
Класс, полиморфизм (Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.03.2012, 00:57     Класс, который невозможно наследовать #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
в С++11 есть final
http://www2.research.att.com/~bs/C++0xFAQ.html#final
http://en.wikipedia.org/wiki/C%2B%2B...ides_and_final
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.03.2012, 00:59     Класс, который невозможно наследовать #3
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
так его потомков просто нельзя будет создавать
запретить наследовать нельзя
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
16.03.2012, 01:04     Класс, который невозможно наследовать #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Специальной конструкции запрета в языке нет. Но народ изощрялся и придумал "финальный" класс. Посмотри — может поможет.

Виртуальное наследование позволяет нам запретить наследование от нашего класса. О том, что это не просто интересная «фишка», а реально необходимая возможность, говорит тот факт, в 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.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 01:06  [ТС]     Класс, который невозможно наследовать #5
Если бы я еще английский знал
И про ключевое слово final в С++ тоже интересно.
На русском хоть в двух словах где-то есть?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
16.03.2012, 01:10     Класс, который невозможно наследовать #6
http://cppnl.blogspot.com/2010/07/final-class.html
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 01:48  [ТС]     Класс, который невозможно наследовать #7
Цитата Сообщение от 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;
}
Мешает
Хотя и прикольно
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
16.03.2012, 01:55     Класс, который невозможно наследовать #8
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
ну и объекты класса не создать
правда можно переопределить new и создавать динамически

Добавлено через 1 минуту
а главное Зачем?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2012, 02:07     Класс, который невозможно наследовать
Еще ссылки по теме:

C++ Класс, который моделирует точку трехмерного пространства
C++ Создать класс который реализует динамический массив
Макрос который создает класс C++

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

Или воспользуйтесь поиском по форуму:
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:07  [ТС]     Класс, который невозможно наследовать #9
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 Посмотреть сообщение
а главное Зачем?
Не знаю. Я на собеседовании у них завтра спрошу зачем им это
Yandex
Объявления
16.03.2012, 02:07     Класс, который невозможно наследовать
Ответ Создать тему
Опции темы

Текущее время: 16:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru