8.15. Вызов виртуальной функции родительского класса

8.15. Вызов виртуальной функции родительского класса

Проблема

Требуется вызвать функцию родительского класса, но она переопределена в производном классе, так что обычный синтаксис p->method() не дает нужного результата.

Решение

Укажите полное имя вызываемого метода, включая имя родительского или базового класса (если есть только два класса, например). (См. пример 8.16.)

Пример 8.16. Вызов определенной версии виртуальной функции

#include <iostream>

using namespace std;

class Base {

public:

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

};

class Derived : public Base {

public:

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

};

int main() {

 Derived* p = new Derived();

 p->foo();       // Вызов версии производного класса

 p->Base::foo(); // Вызов версии базового класса

}

Обсуждение

Регулярное использование переопределения полиморфных возможностей C++ является плохой идеей, но иногда это требуется сделать. Как и в случае с большинством других методик С++, это по большей части вопрос синтаксиса. Когда требуется вызвать определенную версию виртуальной функции базового класса, просто укажите ее имя после имени этого класса, как это сделано в примере 8.16.

p->Base::foo();

Здесь будет вызвана версия foo, определенная в Base, а не та, которая определена в каком-то из подклассов Base, на который указывает p.