2015-04-04 4 views
1

Почему это так, что если функция базового класса перегружена в производном классе, базовая версия функции (даже если она общедоступна) недоступна через объект производного класса ?Перегрузка функции базового класса в производном классе

Например:

#include <iostream> 
#include <string> 

using namespace std; 

class Base { 
public: 
    void f(int i) { 
     cout << "\nInteger: " << i << endl; 
    } 
}; 

class Derived : public Base { 
public: 
    void f(string s) { 
     cout << "\nString: " << s << endl; 
    } 
}; 


int main() { 
    Base b; 
    Derived d; 
    //d.f(5); Doesn't work 
    d.f("Hello"); 
    //d.Base::f(5); works though 
    return 0; 
} 
+0

[Это] (http://stackoverflow.com/questions/2391679/why-do-we-need-virtual-methods-in-c) может быть связано – wowofbob

ответ

1

Имя поиска выполняется до разрешения перегрузки. Поиск по имени начинается в одной области, тогда, если он не находит объявления имени, он ищет охватывающую область и так далее, пока не найдет имя. В этом случае d.f находит объявление void Derived::f(string). Только если не было объявления члена f в Derived, поиск имени перешел к поиску базового класса. Только после того, как имя было найдено, компилятор определяет, есть ли соответствующая перегрузка, и если да, то какая перегрузка является наилучшим совпадением.

Обратите внимание, что вы можете переопределить функцию базового класса в производном классе, чтобы заставить его найти:

class Derived : public Base { 
public: 
    using Base::f; 
    void f(string s) { 
     cout << "\nString: " << s << endl; 
    } 
}; 

Теперь имя поиска будет найти как перегруженные f, а затем перегрузить разрешение будет определять, какой из вызов.

0

Если вы хотите, чтобы иметь возможность в Base::f в дополнение к Derived::f, вы можете добавить строку

using B::f; 

в Derived.

class Derived : public Base { 
    public: 
     using Base::f; 
     void f(string s) { 
     cout << "\nString: " << s << endl; 
     } 
}; 

Теперь вы можете использовать:

Derived d; 
d.f(10); 
d.f("Hello"); 
Смежные вопросы