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

22.Ограничения на использование виртуальных функций.

#include <string>

using namespace std;

class A

{

public:

A( const string& s ) { /* ... */ }

string foo()

{

bar();

return "Строка";

}

virtual void bar()

{

} };

class B : public A

{

public:

B() : A( s = foo() ) {}

private:

string s;

};

int main()

{ B b;

return 0; }

Компилятор берет указатель this, получает указатель на таблицу виртуальных функций, считывает из нее адрес метода bar() и выполняет вызов. Указатель this указывает на объект B, который еще не был создан. Т.е. у него указатель на таблицу виртуальных функций содержит "мусор"!Поэтому приведенный код с высокой долей вероятности вызовет крах системы, и уж точно он не будет делать то, что задумывалось.

САМОЕ ОСНОВНОЕ :Инициализация указателя таблицы виртуальных функций выполняется в конструкторе (перед инициализацией членов класса, но после вызова конструкторов родительских классов). Это накладывает существенное ограничение на использование виртуальных функций при инициализации. Думаю, что на основании этого материала, вы сами сможете промоделировать, как будут работать косвенные вызовы на разных этапах инициализации объекта.

23.Чистая виртуальная функция.

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

Код:

class A

{

public:

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

};

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

24.Абстрактный класс и его использование.

Методы класса могут быть объявлены как абстрактные. Это означает, что в этом классе нет реализации этих методов. Абстрактные методы пишутся с модификатором abstract. Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным (в таком классе могу быть и обычные методы). Нельзя создавать экземпляры абстрактного класса — такой класс может использоваться только в качестве базового класса для других классов. Для потомка такого класса есть две возможности — или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом, и единственная возможность его использования — это производить от него классы потомки).УКАЗатель на абстрактный класс.