Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
12
Добавлен:
24.09.2019
Размер:
187.39 Кб
Скачать

Несколько замечаний по виртуальным функциям:

1. В массивах указателей на базовый класс можно хранить объекты только полиморфных типов (базовый и все производные).

2. В массив нужно объединять только те объекты, которые обладают методами с одинаковыми названиями, но разной реализацией.

3. Если некоторый метод базового класса объявлен виртуальной функцией, тогда методы с такой же сигнатурой во всех производных классах тоже будут виртуальными.

Virtual дает полиморфность.

class Base{ class Derived: public Base{

public : virtual void f(){}; } public: virtual void f(){}; }

int main(){ Base b; Derived d; Base *pb;

pb=&b; pb -> f(); // f() класса Base

pb=&d; pb ->f(); // f() класса Derived }

21) Абстрактные классы в C++.

Абстрактный класс является классом, который может использоваться только в качестве базового для других классов. Абстрактный класс содержит одну или несколько чистых виртуальных функций. Чистая виртуальная функция может рассматриваться как встроенная функция, тело которой определено как =0 (чистый спецификатор). Для чистой виртуальной функции не нужно приводить действительное определение; предполагается, что она переопределяется в производных классах.

К абстрактным классам применимы следующие правила:

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

• абстрактный класс нельзя использовать в явном преобразовании;

• нельзя определить представитель абстрактного класса (локальную/глобальную переменную или элемент данных);

• можно определять указатель или ссылку на абстрактный класс;

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

Например:

class Bird

{

public:

void virtual Sing() = 0;

};//класс Eagle – также абстрактный

class Eagle : public Bird

{};// GoldenEagle – не является абстрактным

class GoldenEagle: public Bird

{

void Sign()

{…} };

22) Чистые виртуальные функции

Чистые виртуальные функции

Можно подумать, что все остальные функции грязные! Нет, конечно. Чистая в данном случае означает буквально пустая функция. Давайте посмотрим, что такое чистая виртуальная функция.

Код:

class A

{

public:

virtual void v_function(void)=0;//чистая виртуальная функция

};

Как видите, все отличие только в том, что появилась конструкция =0, которая называется чистый спецификатор. Чистая виртуальная функция абсолютно ничего не делает и недоступна для вызовов. Ее назначение служить основой (если хотите, шаблоном) для замещающих функций в производных классах. Класс, который содержит хотя бы одну чистую виртуальную функцию, называется абстрактным классом. Почему абстрактным? Потому, что создавать самостоятельные объекты такого класса нельзя. Это всего лишь заготовка для других классов. Механизм абстрактных классов разработан для представления общих понятий, которые в дальнейшем предполагается конкретизировать. Эти общие понятия обычно невозможно использовать непосредственно, но на их основе можно, как на базе, построить производные частные классы, пригодные для описания конкретных объектов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]