- •Операторы динамического распределения памяти
- •Перегрузка функций и операций
- •Объекты и классы Класс как обобщение структуры
- •Определение первичного класса
- •Перегрузка операций
- •Конструкторы
- •Список инициализации
- •Деструктор
- •Дружественные классы
- •Статические элементы класса
- •Шаблоны функций
- •Контейнерные классы Шаблоны классов
- •Параметризованные очереди и стеки
- •Бинарные деревья
- •Определение класса множества
- •Производные классы Доступ к полям и функциям базового класса
- •Класс дерева поиска
- •Параметризованный связный список
- •Множественное наследование
- •Виртуальные классы
- •Виртуальные функции Переопределение составной функции
- •Организация списка объектов различного типа
- •Виртуальные деструкторы
- •Абстрактные классы
Производные классы Доступ к полям и функциям базового класса
#include <iostream.h> //библиотека потокового ввода-вывода
void f()
{
cout << “\nВнешняя функция”
}
struct Base1 //первый класс
{
void f() { cout << “\nФункция из Base1”;}
};
struct Base2 //второй класс
{
void f() { cout << “\nФункция из Base2;”}
};
struct Deriv: Base1, Base2 //класс, производный от двух данных классов
{
void f() {::f();} // вызов внешней функции
}
int main()
{
Deriv obj; //создаём объект класса Deriv
f();
obj.Base1::f();
obj.Base2::f();
obj.f();
return 0;
}
В результате работы программы будут выведены следующие строки:
Внешняя функция
Функция из Base1
Функция из Base2
Внешняя функция
Таблица 4.1
Доступ в базовом классе |
Атрибут доступа перед базовым классом |
Доступ в производном классе |
|
struct |
class |
||
public |
отсутствует |
public |
private |
protected |
отсутствует |
public |
private |
private |
отсутствует |
недоступны |
недоступны |
public |
public |
public |
public |
protected |
public |
protected |
protected |
private |
public |
недоступны |
недоступны |
public |
protected |
protected |
protected |
protected |
protected |
protected |
protected |
private |
protected |
недоступны |
недоступны |
public |
private |
private |
private |
protected |
private |
private |
private |
private |
private |
недоступны |
недоступны |
В таблице отражено преобразование статуса доступа как для классов, определенных с помощью ключевого слова struct, так и для классов, заданных с помощью class. Например:
Class A: protected B { };
Struct A: B { };
Класс дерева поиска
Ниже приведён текст программы, реализующей класс дерева поиска:
#include <stdio.h> //стандартная библиотека ввода-вывода
#include <conio.h> //библиотека консольного ввода-вывода
struct NODE //структура узла дерева
{
int info; //информационное поле
NODE *left, *right; //указатели на левое и правое поддеревья
};
class LIST //базовый класс списка
{
protected:
NODE *root;
public:
LIST() { root = NULL;}
};
class TREE: LIST //класс дерева поиска, производный
//от класса списка
{
public:
void insert(int x); //добавление элемента
void show(); //обход в симметричном порядке
};
NODE* insert(NODE* root, int x)
{
if (!root) //если дерево пусто, то
{
root = new NODE; //создаём новое дерево
root -> info = x; //заполняем информационную часть
root -> left = root -> right = NULL;
}
else
{
//дерево не пусто
//если значение добавляемого элемента меньше чем
//значение информационной части корня, то его следует добавлять
//в левое поддерево
if (x < root -> info) root -> left = insert(root -> left, x);
//в противном случае его следует добавлять в правое поддерево
else root -> right = insert(root -> right, x);
}
return root;
};
void TREE :: insert(int x)
{
root = ::insert(root, x);
};
void display(NODE* p)
{
if(p)
{
display(p -> left); //переходим в левое поддерево
printf("\n%d", p -> info); //отображаем содержимое
//информационного поля
display(p -> right); //переходим в правое поддерево
}
};
void TREE :: show()
{
display(root);
};
int main()
{
TREE a; //создадим объект класса дерево
clrscr(); //очистим экран
//добавим в дерево произвольные элементы
a.insert(2);
a.insert(3);
a.insert(1);
a.insert(12);
a.insert(21);
a.insert(14);
a.insert(20);
a.insert(3);
printf ("Обход дерева в симметричном порядке:");
a.show(); //отобразим дерево на экране
getch(); //ожидание нажатия любой клавиши (пауза)
return 0;
}
Результаты работы программы
Обход дерева в симметричном порядке:
1
2
3
3
12
14
20
21