Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
примеры к лекциям ООП.doc
Скачиваний:
7
Добавлен:
24.11.2019
Размер:
2.9 Mб
Скачать

Производные классы Доступ к полям и функциям базового класса

#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