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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Данная последовательность из n целых чисел... http://www.cyberforum.ru/cpp-beginners/thread519901.html
1.Данная последовательность из n целых чисел. Найти количество элементов этой последовательности, кратных числу К. 2.Данная последовательность целых чисел, за которой следует 0. Найти сумму нечетных элементов этой последовательности. 3.Найти сумму чисел в десятичном числе К.
C++ форсированная перезапись Форумчане, подскажите, пожалуйста, что такое форсированная перезапись? http://www.cyberforum.ru/cpp-beginners/thread519899.html
Ошибка при добавлении конструктора в класс C++
В классе при добавлении конструктора возникает ошибка. Класс(class hinans) работал нормально,до того как добавил hinans(sterling s) { chis = 0; } в первой строчке показывает ошибку File1.cpp(29): E2293 ) expected
C++ Нахождение остатка от деления любых дробных чисел
// Ostatok.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "string.h" #include "stdio.h" #include <iostream.h> int CharToInt(char s)//перевод в целые числа {
C++ Создать массив из пяти элементов. http://www.cyberforum.ru/cpp-beginners/thread519886.html
Создать массив из пяти элементов. Ввести число и сравнить поочерёдно с каждым элементом массива. #include <stdio.h> main() { int mas ={3,7,0,2,2}; /*ñîçäà¸ì ìàññèâ èç 5 ýëåìåíòîâ*/ int x,i; printf("enter x\n"); scanf("%d",&x); for(i=0;i<=2;i++){ if (x==mas) printf ("%d ravno %d\n",x,mas);
C++ Объясните некоторые моменты в задаче Здравствуйте, вот мне накинули задачу Пользователь вводит число А не более 4-х разрядов. Вывести всевозможные комбинации из цифр этого числа длиной числа А. Цифры могут повторяться. Без массива! И решение такое #include "stdafx.h" #include "math.h" void main () подробнее

Показать сообщение отдельно
Infinity3000
1058 / 577 / 24
Регистрация: 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.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru