2009-10-24 2 views
-3

Я определил класс A и получил новый класс B из A. Я перегрузил функцию SetData() в классе B. Когда я попытался получить доступ к функции SetData класса B с помощью объекта B, компилятор этого не разрешает. Почему это так ?Функция-член переопределения по иерархии классов

class A{ 

public : 
     void SetData();  
}; 

class B : public A { 

public: 
     void SetData(int); 
}; 

B b; 
b.SetData() ; // error 
+0

Ну, всегда можно начать с чтения ошибки. – 2009-10-24 08:37:52

+1

код выглядит действительным. Пожалуйста, сообщите точное сообщение об ошибке получения. –

+0

BTW, оператор которого перегружен здесь? –

ответ

4

OMG, без ошибок сообщение. -1 для вас.

Но позвольте нам использовать телепатию и угадать ваше сообщение об ошибке. Вы получаете что-то вроде «символ не найден», потому что вы пытаетесь вызвать функцию B::SetData(), у которой нет тела. И он должен иметь тело, даже если он ничего не делает и даже если он объявлен в родительском классе! Попробуйте добавить его в тело вашего класса

class B : public A { 
public: 
     void SetData(int) 
     { /* add body here */ }; 
}; 

или вне его

class B : public A { 

public: 
     void SetData(int); 
}; 
void B::SetData(int) 
{ 
    //write it here 
} 
+0

+1 для хорошего анализа. –

1
b.SetData(2) ; // error 

Я не вижу никаких проблем в призыве SetData(2).

Адрес, если вы звоните b.SetData() ;, тогда произошла ошибка. Когда вы определяете метод с тем же именем в производном классе, методы базового класса с тем же именем будут скрыты в производном классе.

Вы можете сделать их видимыми в производном классе по ключевому слову using.

class A{ 

public : 
    void SetData(){} 
}; 

class B : public A { 

public: 

    using A::SetData; 
    void SetData(int){} 
}; 



int main() 
{ 
B b; 
b.SetData() ; // error 
} 
0

Что я думаю, вы могли бы столкнуться

Ошибка: неразрешенный внешний символ

написать код, как предложил Павел Швед

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