Функция чистого 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();
}
};
Использование случае я могу думать с верхней части моей головы, когда есть более или менее разумное поведение по умолчанию, но класс дизайнер хочет, чтобы бы-по умолчанию поведение вызывается только явно. Также может быть так, что вы хотите, чтобы производные классы всегда выполняли свою собственную работу, но также могли называть общий набор функций.
Обратите внимание, что даже если это разрешено языком, это не то, что я вижу обычно используемым (и тот факт, что это может быть сделано, кажется, удивляет большинство программистов на С ++, даже опытных).
Поскольку вы не имеете никакого контроля доступа, указанный для 'F()' в объявлении класса 'Ā',' A :: f() '' дефолтов в private'. Возможно, это не то, что вы хотите. –