воскресенье, 1 сентября 2013 г.

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

Чистая виртуальная функция может иметь определение, вынесенное вне класса. Для обращения к такой функции необходимо указывать область имен класса при обращении через указатель на базовый класс.
Польза:
Возможность определения чисто виртуальной функции может быть использована в качестве механизма обеспечения более безопасной реализации по умолчанию обычных виртуальных функций: не позволит случайно унаследовать неверное поведение, не введет дополнительное имя в класс (отдельную функцию с реализацией), но предоставит поведение по умолчанию, которое можно получить только явным указанием имени базового класса.

Пример 1:

struct TT
{
            virtual void foo () = 0;
};

void TT::foo()
{
            cout << "TT::foo" << endl;
}

struct T1 : TT
{
            virtual void foo ()
            {
TT::foo();                                                 //!
                        cout << "T1::foo" << endl;
            }
};

int main()
{
            TT* p = new T1;
            p->foo();
            p->TT::foo();                      // Требуется раскрытие области имен.
            delete p;
            return 0;
}

Пример 2:

class Airplane {
public:
virtual void fly(const Airport& destination) = 0;
//...
};
void Airplane::fly(const Airport& destination) // реализация чисто
{ // виртуальной функции
//код по умолчанию, описывающий полет
//самолета в заданный пункт назначения
}

class ModelA: public Airplane {
public:
virtual void fly(const Airport& destination)
{ Airplane::fly(destination);}
...
};
class ModelB: public Airplane {
public:
virtual void fly(const Airport& destination)
{ Airplane::fly(destination);}
//...
};
class ModelC: public Airplane {
public:
virtual void fly(const Airport& destination);
//...
};
void ModelC::fly(const Airport& destination)
{
//код, описывающий полет самолета ModelC в заданный пункт назначения
}

Источник: Скотт Мэйерс Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ.

По мотивам правила 34.

Комментариев нет:

Отправить комментарий