- •Введение в понятие класса
- •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)
Множественное наследование
Язык С++ позволяет наследование не только от одного, а одновременно от нескольких классов. Форма наследования следующая:
class имя-производного-класса:список базовых классов {
// ……..
};
Список базовых классов содержит перечисленные базовые классы с соответствующими режимами доступа к каждому из базовых классов. Пример
class Z:public U, public V, protected W {// …. };
рассмотрим предыдущий пример с множественным наследованием, когда классы X и Y равноправны.
#include <iostream.h>
class X {
protected:
int x;
public:
X(int i); // Конструктор с параметром
~X(void); // Деструктор
void put_x(int i) { x = i;}
int get_x(void) { return x;}
void show(void);
};
class Y {
protected:
int y;
public:
Y(int i); // Конструктор с параметром
~Y(void); // Деструктор
void put_y(int i) { y = i;}
int get_y(void) { return y;}
void show(void);
};
class Z: public X, public Y{
protected:
int z;
public:
Z(int i, int j); // Конструктор с параметром
~Z(void); // Деструктор
void make_z(void);
void show(void);
};
X::X(int i)
{
x=i;
cout<<”\n Конструктор Х\n”;
}
X::~X(void)
{
cout<<”\n деструктор X\n’;
}
void X::show(void)
{
cout<<”\n x=”<<x<<endl;
}
Y::Y(int i)
{
y=j;
cout<<”\n Конструктор Y\n”;
}
Y::~Y(void)
{
cout<<”\n деструктор Y\n’;
}
void Y::show(void)
{
cout<<”\n y=”<<y<<endl;
}
Z::Z(int i, int j):X(i),Y(j)
// конструктор Z передает значения параметров конструкторам Х и Y, поэтому
// он должен иметь два параметра
{
cout<<”\n Конструктор Z\n”;
}
Z::~Z(void)
{
cout<<”\n деструктор Z\n’;
}
void Z::make_z(void)
{
z=x*y;
}
void Z::show(void)
{
cout<<z<<” = ”<<x<<” *”<<y<<endl;
}
void main(void)
{
Z zobject(3,5); // создание и инициализация объекта
zobject.make_x();
zobject.show();
zobject.X::show(); // вызов функции
zobject.Y::show(); // show из разных классов
zobject.put_x(7); // новые значения
zobject.put_y(9); // переменных x,y
zobject.make_z();
zobject.show();
zobject.X::show(); // вызов функции
zobject.Y::show(); // show из разных классов
}
Замечание
Пока конструкторы базовых классов не имеют аргументов, то производный класс может не иметь функцию-конструктор. Если же конструктор базового класса имеет один или несколько аргументов, то каждый производный класс обязан иметь конструктор. Чтобы передать аргументы в базовый класс, нужно определить их после объявления конструктора базового класса, как указано в основной форме:
конструктор-производного-класса(список аргументов):
базовый-класс1(список аргументов),
базовый-класс2(список аргументов),
…
базовый-классN(список аргументов)
{
…
}
Базовый-классI – имя конструктора базового класса, который наследуется производным классом
Список аргументов, ассоциированный с базовым классом, может состоять из констант, глобальных параметров и/или параметров для конструктора производного класса. Так как объект инициализируется во время выполнения программы, можно в качестве параметров использовать переменные.