33. C++ Виртуальный деструктор
Виртуальный деструктор Как известно, указатель на базовый класс является указателем и на классы наследники, а также можно создать объект класса (как переменную) в динамической памяти и присвоить адресу указателю на базовый класс. т.е. class A {//code}; class B : public A {//code}; int main () { A *ptrA=new B; delete ptrA; return 0; } Что […]
32. C++ Интерфейс в ООП
Интерфейс в ООП На основе информации по абстрактным классам, наследованию и тому, что указатель на базовый класс является указателем на классы-наследники вырисовывается еще один из способов использования этих понятий – интерфейс, что это такое: Интерфейс – класс у которого все методы виртуальные, этот класс показывает ВСЕ ДОСТУПНЫЕ методы для работы с подобными классами, т.е. сам […]
31. C++ Абстрактный класс
Абстрактный класс Иногда для логического наследования нельзя создать определенный класс родитель, например: Пусть у нас есть корзина с яблоками, грушами и апельсинами и нам нужно создать классы для описывающие их (в качестве описания просто выведем сбщ. в консоль методом i_called() // я называюсь) Кто тогда будет классом родителем? Наследовать апельсин от яблока – нелогично, равно […]
30. C++ Делегирующие конструкторы
Делегирующие конструкторы Аналогично вызову конструктора базового класса из класса наследника можно принудительно вызывать один конструктор другим внутри ОДНОГО класса: синтаксис такой: Myclass(arg1){//code with arg1} MyClass(arg1, arg2) : Myclass(arg1){//code with arg2} Например: Пусть у нас есть класс employer (работник) class Employer { public: Employer(string Name) { this->Name= Name; this->age= 0; this->position=”нет данных”; //Должность } Employer(string Name, […]
29. C++ Вызов конструктора базового класса из класса – наследника
Вызов конструктора базового класса из класса – наследника Как говорилось ранее при создании класса наследника сначала вызывается конструктор базового класса и лишь потом после создания базового класса вызывается конструктор класса наследника, ранее мы использовали конструктор без параметров (конструктор по умолчанию) для базового класса, но мы можем вызывать и произвольный конструктор Для этого в базовом классе […]
28. C++ Виртуальные методы класса, ключевые слова virtual и override
Виртуальные методы класса, ключевые слова virtual и override В предыдущей теме мы рассмотрели основные принципы наследования, но что делать если мы в классе-наследнике хотим использовать функцию с таким же именем как в базовом классе? Для этого мы должны «перезаписать функцию» делается это при помощи ключевых слов virtual и override В базовом классе у перезаписываемой функции […]
27. C++ Наследование
Наследование Как говорилось во введении в c++ в классах можно выполнять наследование, т.е. передавать все или часть свойств класса родителя классу наследнику и дополнять их. Общий вид наследования выглядит так: class имя_нового_класса: модификатор_доступа наследуемый_класс { //тело нового класса } Модификаторы доступа при наследовании мы уже рассматривали в теме «модификаторы доступа» Продемонстрируем на примере: //Создадим […]
26. C++ Перегрузка префиксного и постфиксного инкремента
Перегрузка префиксного и постфиксного инкремента Для начала поговорим чем отличаются префиксный и постфиксный инкремент и декремент (синтаксически они одинаковы): Префиксный ++i; Постфиксный i++; Дело в том, что когда мы напишем код: int i=10; int a=++i; у нас сначала выполнится действие ++i и лишь потом операция присваивания, и результат будет a=11; а когда мы напишем код: […]
25. C++ Перегрузка конструкторов, методов и операторов
Перегрузка конструкторов, методов и операторов Как было сказано ранее метод и конструктор по сути своей являются функциями, а функции как мы уже рассматривали можно перегружать, т.е. создавать несколько функций с одинаковыми именами, но разными аргументами или типом функции (const/не const). Рассмотрим перегрузку конструкторов и методов на примере: class Person { public: Person(string Name,unsigned int age) […]
24. C++ Конструкторы и деструктор класса
Конструкторы и деструктор класса Когда мы работали со структурами, мы могли выполнить их инициализацию при создании, для классов тоже существует подобная возможность, но в несколько расширенном виде. Примечание: в дальнейшем в статье словом «специфический» обозначено нестандартное выделение/выделение не по умолчанию / работа с динамической памятью и тд Как было сказано в более ранних статьях, классы […]