- •Введение в понятие класса
- •Void queue::init(void)
- •Перегруженные функции
- •Int sqr_it(int I); // Прототипы
- •Перегрузка операций.
- •Наследование
- •Конструкторы и деструкторы
- •Int sloc,rloc;
- •Void qput(int); // Прототип
- •Int qget(void); // Прототип
- •Конструктор с параметрами
- •Конструктор копирования
- •Void input();
- •Void output();
- •Void ThreeAngle::input()
- •Void ThreeAngle::output()
- •Void main(void)
- •Дружественные функции
- •Замечание
- •Дружественные классы
- •Аргументы функций, задаваемые по умолчанию
- •Void main(void)
- •Void stringxy(char *str, int X, int y)
- •Структуры и классы
- •Объединения и классы
- •Void main()
- •Наследование классов
- •Конструкторы с параметрами при наследовании
- •Множественное наследование
- •Перегрузка функций и операций
- •Ключевое слово this
- •Перегрузка операций ввода/вывода. Инсерторы и экстракторы
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3);
- •Дружественные функции-операции
- •Void main(void)
- •Void swap1(int *I, int *j)
- •Void swap(int a, int b)
- •Void swap1(int *I, int *j)
- •Void swap2(int &a, int &b)
- •Использование ссылочных переменных для перегрузки унарных операций
- •Перегрузка операции индексации [ ]
- •Использование виртуальных функций
- •Указатели на производные типы
- •Виртуальные функции
- •Замечания к использованию виртуальных функций
- •Пример использования виртуальных функций
- •Чистые виртуальные функции и абстрактные типы
- •Производные классы и их конструкторы и деструкторы
- •Void main()
- •Конструкторы и деструкторы при множественном наследовании
- •Void main()
- •Виртуальные базовые классы.
- •Операции динамического выделения памяти new и delete
- •Void main(void)
- •Void main(void)
- •Виртуальные деструкторы
- •Void main(void)
- •Void main(void)
- •Шаблоны классов и функций
- •Шаблоны функций
- •Void main(void)
- •Void main(void)
- •Шаблоны классов
- •Int sloc, rloc;
- •Void qput(t I);
- •Void main(void)
- •Статические члены класса
- •Локальные классы
- •Void f(void);
- •Void main(void)
- •Void f(void)
- •Вложенные классы
- •Void main(void)
Производные классы и их конструкторы и деструкторы
Базовый и производные классы могут иметь конструкторы и деструкторы. Рассмотрим, в каком порядке вызываются эти функции. Этот вопрос возникает и при множественном наследовании.
Пример:
#include <iostream.h>
class Base{
public:
Base () { cout<<”\n Конструктор класса Base \n”;}
~Base () { cout<<”\n Деструктор класса Base \n”;}
};
class Derive1:public Base{
public:
Derive1 () { cout<<”\n Конструктор производного класса Derive1 \n”;}
~Derive1 () { cout<<”\n Деструктор производного класса Derive1 \n”;}
};
class Derive2:public Derive1{
public:
Derive2 () { cout<<”\n Конструктор производного класса Derive2 \n”;}
~Derive2 () { cout<<”\n Деструктор производного класса Derive2 \n”;}
};
Void main()
{
Derive1 d1;
cout<<”\n”;
Derive2 d2;
cout<<”\n”;
}
В программе создаются объекты типа Derive1 и Derive2, при этом выполняются конструкторы и деструкторы в следующей последовательности.
На экране:
Конструктор класса Base
Конструктор производного класса Derive1
Конструктор класса Base
Конструктор производного класса Derive1
Конструктор производного класса Derive2
Деструктор производного класса Derive2
Деструктор производного класса Derive1
Деструктор производного класса Base
Конструкторы и деструкторы при множественном наследовании
В С++ разрешено при создании производного класса пользоваться несколькими базовыми классами. При объявлении производного класса базовые классы перечисляются через запятую. При создании объекта конструкторы выполняются в порядке следования базовых классов слева направо.
Пример:
#include <iostream.h>
class Base1{
public:
Base1() { cout<<”\n Конструктор класса Base1 \n”;}
~Base1 () { cout<<”\n Деструктор класса Base1 \n”;}
};
class Base2{
public:
Base2() { cout<<”\n Конструктор класса Base2 \n”;}
~Base2 () { cout<<”\n Деструктор класса Base2 \n”;}
};
class Derive:public Base1, public Base2{
public:
Derive () { cout<<”\n Конструктор производного класса Derive \n”;}
~Derive () { cout<<”\n Деструктор производного класса Derive\n”;}
};
Void main()
{
Base1 b1;
cout<<”\n”;
Base1 b2;
cout<<”\n”;
Derive d;
cout<<”\n”;
}
Деструкторы выполняются в порядке, обратном по отношению к конструкторам.
Виртуальные базовые классы.
При множественном наследовании базовый класс не может быть задан в производном классе более одного раза:
class Derive:Base, Base {…}; // ошибка
В то же время базовый класс может быть передан производному классу более одного раза косвенно:
class X:public Base{…};
class Y:public Base{…};
class Derive:public X, public Y{…};
Этот пример соответствует схеме наследования, когда каждый объект класса Derive будет иметь два подобъекта класса Base. Чтобы избежать неоднозначности при обращении к членам базового объекта Base, можно объявить этот базовый класс виртуальным. Для этого используется то же зарезервированное слово virtual, что и при объявлении виртуальных функций.
class X:virtual public Base{…};
class Y:virtual public Base{…};
class Derive:public X, public Y{…};
Теперь класс Derive имеет только один подобъект класса Base.