Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализация наследования — лекция-презентация

.pdf
Скачиваний:
24
Добавлен:
11.04.2014
Размер:
179.84 Кб
Скачать

Пример использования виртуального базового класса

 

 

 

 

 

 

Base

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

виртуальное

 

 

 

float f_value

 

 

 

виртуальное

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

float value()

 

 

 

наследование

 

 

 

 

 

 

 

наследование

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Derived1

 

Derived2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Final

41

{ f_value = 1.0; puts("1.0"); } { return f_value; }

Пример использования виртуального базового класса

// Базовый класс - прародитель class Base

{

public: Base()

float value()

protected:

float f_value;

};

42

Пример использования виртуального базового класса

// Промежуточный производный класс class Derived1 : virtual public Base

{

 

public:

 

Derived1()

{ f_value = 1.1; puts("1.1");}

};

 

// Промежуточный производный класс class Derived2 : virtual public Base

{

 

public:

 

Derived2()

{ f_value = 1.2; puts("1.2"); }

};

 

43

Пример использования виртуального базового класса

//Производный класс, который содержит ОДНО поле

//f_value и ОДИН метод value(), который будет

//обращаться к этому полю

class Final: private Derived1, private Derived2

{

};

int main(int argc, char *argv[])

{

Final f;

printf("value = %g", f.value());

return 0;

}

44

Пример использования виртуального базового класса

1.0

1.1

1.2

value = 1.2

Полю value присвоено значение 1.2, т.к. последним вызывался конструктор класса Derived2

45

Уровни доступа при наследовании через общих предков

Спецификаторы доступа при наследовании могут отличаться в разных родительских классах

Следовательно, одни и те же элементы прародительского класса будут иметь различные спецификаторы доступа в производном классе

В таком случае наиболее жесткий уровень защиты игнорируется и используется менее ограничитель-

ная категория

46

Рекомендации по использованию множественного наследования

Из-за проблем, возникающих при множественном наследовании классов, многие языки программирования его не поддерживают

В современных ООП-языках вместо множественного наследования классу разрешено реализовывать несколько интерфейсов

Использование интерфейсов решает проблему на-

следования через общих предков

47

Интерфейсы

Интерфейс — это множество требований (requirements), предъявляемых к соответствующему классу

Требования выражаются в объявлении методов

Объявление интерфейса на языке Java

public interface <имя интерфейса>

{

// заголовки методов

48 }

Свойства интерфейсов (применительно к языку Java)

В интерфейсе не может быть ни полей, ни статических методов, но могут объявляться статические константы

Нельзя создать экземпляр интерфейса, но можно объявить интерфейсную переменную

Интерфейсные переменные должны ссылаться на объект класса, реализующего данный интерфейс

Аналогично классам интерфейсы могут образовы-

49 вать иерархию наследования

Реализация интерфейсов (применительно к языку Java)

Реализация интерфейса выполняется каким-либо классом путем определения методов, указанных в интерфейсе

class <имя класса> implements <имя интерфейса>

{

//описание класса, в том числе, методов,

//указанных в интерфейсе

}

50