Чистая виртуальная
функция может иметь определение, вынесенное вне класса. Для обращения к такой
функции необходимо указывать область имен класса при обращении через указатель
на базовый класс.
Польза:
Возможность
определения чисто виртуальной функции может быть использована в качестве
механизма обеспечения более безопасной реализации по умолчанию обычных
виртуальных функций: не позволит случайно унаследовать неверное поведение, не
введет дополнительное имя в класс (отдельную функцию с реализацией), но
предоставит поведение по умолчанию, которое можно получить только явным
указанием имени базового класса.
Пример 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.
Комментариев нет:
Отправить комментарий