
- •Введение в понятие класса
- •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)
Конструкторы с параметрами при наследовании
Рассмотрим пример. Класс X задает переменную х, класс У задает переменную у, класс Z содержит переменную z, которая будет содержать произведение x*y. Каждый из классов содержит функцию void show(void). В примере продемонстрировано использование функций, имеющих одинаковые имена в базовом и производном классах. Обе эти функции доступны, так как у них различаются полные имена, соответственно Z::show(), X::show(), Y::show(). На этом примере можно проводить эксперименты, изменяя режимы доступа к переменным х и у, режимы доступа при наследовании классов.
#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:public X {
protected:
int y;
public:
Y(int i, int j); // Конструктор с параметром
~Y(void); // Деструктор
void put_y(int i) { y = i;}
int get_y(void) { return y;}
void show(void);
};
class Z: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, int j):X(i)
// конструктор класса У передает значение конструктору класса Х, поэтому
// он должен иметь два параметра
{
y=j;
cout<<”\n Конструктор Y\n”;
}
Y::~Y(void)
{
cout<<”\n деструктор Y\n’;
}
void Y::show(void)
{
cout<<”\n x=”<<x<<” y=”<<y<<endl;
}
Z::Z(int i, int j):Y(i,j)
// конструктор Z передает значения параметров конструктору Х, поэтому
// он должен иметь два параметра
{
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 из разных классов
}
Следует обратить внимание на передачу параметров конструктора производного класса конструктору базового класса
Y::Y(int i, int j):X(i) {//….}
Попытка просто изменить режим доступа при наследовании классов на private, вместо public без каких-либо других изменений, вызовет ошибку компилятора. Для того, чтобы изменить программу так, чтобы при этом режиме наследования программа работала правильно, необходимо использовать функции get_x() и get_y().
В этом примере использовалась следующая схема наследования
class X ----------- class Y -------- class Z
При таком наследовании классы X и Y практически равноправны, но из-за реализации простого наследования класс Y существенно отличается от класса Х, хотя бы числом параметров конструктора. Чтобы сделать классы равноправными можно использовать механизм множественного наследования.