2015-06-09 8 views
0

Я не понимаю, почему этот код дает ошибку компиляции, это не случай переопределения, потому что список параметров в базовом и дочернем классах различен, так что может кто-нибудь помочь мне в этом.Невозможно вызвать функцию базового класса

#include <iostream> 
using namespace std; 
class Base 
{ 
    public: 
    void func () 
    { 
     cout<< a ; 
    } 

    protected: 
    int a; 
}; 

class Drived : public Base 
{ 
    public: 
    void func (int inVal) 
    { 
     cout<< b <<"-> "<<inVal; 
    } 

    protected: 
    int b; 
}; 

int main(int argc, char* argv[]) 
{ 
    Drived d; 
    d.func(); //->Compilation error why and how can we avoid it? 
    return 0; 
} 

ответ

3

При поиске подходящей функции компилятор выполняет поиск по более крупным областям, пока не найдет область, содержащую правильное имя. Затем (для вызова функции) он собирает все в этой области с этим именем и выполняет перегрузку на них, чтобы найти правильный вызов. Если ни один из них не может быть вызван, он останавливается, и это ошибка. Он делает не продолжает поиск через больше областей, ищущих другую функцию для вызова.

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

class Derived : public Base 
{ 
    public: 
    using Base::func; // <--- this is what we added 
    void func (int inVal) 
    { 
     cout<< b <<"-> "<<inVal; 
    } 

    protected: 
    int b; 
}; 

С, что на месте, компилятор будет рассматривать Derived::func и Base::func как набор перегрузки, и убедитесь, что вы не передали какие-либо параметры, так что Base::func - это единственное, что вы могли бы назвать, так это то, что он разрешает.

+0

Спасибо, это решить мою проблему. – P3A

+0

Наследует базовый класс, не приведет к тому, что функция базового класса будет доступна в той же области, что и производная функция класса? – P3A

+0

@ P3A: Нет. Каждый класс определяет отдельный объем. –

0

вставить эту строку, и она будет работать

Drived d; 
d.func(1); //whats changed? 
return 0; 
return 0; 

Я считаю, что вы должны понять разницу самостоятельно. Это не так сложно. посмотрите

1

func в Drived скрывается в одном Base. Самый простой способ назвать это указать область:

d.Base::func(); 

Если Base::func была виртуальная функция, однако это будет отключить виртуальную отправку. Альтернативным решением является приведение Base декларации в рамках Drived класса с использованием декларирование:

class Drived : public Base 
{ 
public: 
    using Base::func; 
    void func(int inVal) 
    ... 
}; 
+0

Спасибо за ваш ответ! – P3A

Смежные вопросы