2015-06-04 2 views
1

Почему компилятор не вызывает функцию базового класса (параметризованную) через объект производного класса? Производный класс наследует функцию от базового класса, правильно?Вызов функции базового класса через производный объект класса

#include<iostream> 
using namespace std; 

class Base 
{ 
public: 
    int fun() { cout << "Base::fun() called"; } 
    int fun(int i) { cout << "Base::fun(int i) called"; } 
}; 

class Derived: public Base 
{ 
public: 
    int fun() { cout << "Derived::fun() called"; } 
}; 

int main() 
{ 
    Derived d; 
    d.fun(5); 
    return 0; 
} 

Однако, когда я использовал оператор разрешения области, я получил желаемый результат. Может ли кто-нибудь объяснить мне логическое объяснение? Могу ли я по-прежнему вызывать функцию базового класса (параметризованную) через объект производного класса? Благодаря!

int main() 
{ 
    Derived d; 
    d.Base::fun(5); 
    return 0; 
} 

ответ

3

Производная функция Derived::fun()шкуры все члены с тем же именем из базового класса. Таким образом, вы можете использовать только элемента базового класса с помощью разрешения области. Чтобы избежать скрытия, вы можете:

class Derived: public Base 
{ 
public: 
    int fun() { cout << "Derived::fun() called"; } 
    using Base::fun; 
};