Чистая virtual
функция должна быть реализована в производном типе, который будет непосредственно создан, однако базовый тип все еще может определять реализацию.Производный класс может явно вызывать реализацию базового класса (если это разрешено правами доступа), используя полностью заданное имя (вызывая A::f()
в вашем примере - если A::f()
было public
или protected
).Что-то вроде:
class B : public A {
virtual void f() {
// class B doesn't have anything special to do for f()
// so we'll call A's
// note that A's declaration of f() would have to be public
// or protected to avoid a compile time problem
A::f();
}
};
Вариант использования, который я могу придумать, - это когда более или менее разумное поведение по умолчанию, но разработчик класса хочет такое поведение по умолчаниювызываться только явно.Это также может быть случай, когда вы хотите, чтобы производные классы всегда выполняли свою собственную работу, но при этом могли вызывать общий набор функций.
Обратите внимание, что, хотя это разрешено языком, это не то, что яувидеть часто используемые (и тот факт, что это можно сделать, кажется, удивляет большинство программистов на C ++, даже опытных).