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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
#1

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

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

Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс, который невозможно наследовать (C++):

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

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

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

Макрос который создает класс - C++
Создал макрос который создает класс, но почему то он не работает, инициализация класса не происходит???? #include <iostream> using...

Класс который рисует на экране звезду - C++
Помогите исправить ошибку. Нужно создать класс которорый рисует на экране звезду. Класс написал и все работало, но надо сделать...

Класс, который удаляет из строки все пробелы - C++
Нужен класс, который удаляет из строки все пробелы. Как сие лучше реализовать? Придумалось вот такое: #include <iostream> #include...

8
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 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%2B11#Explicit_overrides_and_final
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.03.2012, 00:59 #3
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Видимо, поместить конструктор в раздел private?
Кто что скажет по этому поводу?
так его потомков просто нельзя будет создавать
запретить наследовать нельзя
1
Infinity3000
1058 / 577 / 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.
3
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 01:06  [ТС] #5
Если бы я еще английский знал
И про ключевое слово final в С++ тоже интересно.
На русском хоть в двух словах где-то есть?
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
16.03.2012, 01:10 #6
http://cppnl.blogspot.com/2010/07/final-class.html
1
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;
}
Мешает
Хотя и прикольно
0
ValeryS
Модератор
6673 / 5082 / 474
Регистрация: 14.02.2011
Сообщений: 17,048
16.03.2012, 01:55 #8
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Как создать класс, который невозможно наследовать?
Видимо, поместить конструктор в раздел private?
ну и объекты класса не создать
правда можно переопределить new и создавать динамически

Добавлено через 1 минуту
а главное Зачем?
0
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 Посмотреть сообщение
а главное Зачем?
Не знаю. Я на собеседовании у них завтра спрошу зачем им это
0
16.03.2012, 02:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2012, 02:07
Привет! Вот еще темы с ответами:

Написать класс, который создает и выводит массив - C++
Помогите изменить этот код чтобы был класс который создает и выводит мой массив)7 #include &lt;iostream&gt; using namespace std; void...

Хелп! родовой класс, который реализовывал бы очередь - C++
Нужно разработать родовой класс, который реализовывал бы очередь. Не знаю даже приблизительно с чего начать(

Создать класс который реализует динамический массив - C++
Доброго времени суток! Помогите с такой задачей - Создать класс который реализует динамический массив(нельзя использовать шаблон...

Определите класс, который должен содержать атрибуты - C++
Здравствуйте уважаемые любители и ценители языка С++! У меня к вам огромная просьба. На днях нужно сдать контрольную работу по предмету...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru