Russian Qt Forum

Программирование => С/C++ => Тема начата: dr_Begemot от Июль 09, 2009, 15:14



Название: Перегрузка методов при наследовании класса
Отправлено: dr_Begemot от Июль 09, 2009, 15:14
Возник такой вопрос...
Пишу класс:
Код:
class A{
public:
  void setVal(double v){ val = v; }
private:
  double val;
};
Наследую от него другой класс:
Код:
class B : public A
{
public:
  bool setVal(QString str)
  {
bool ok = false;
double d = str.toDouble(&ok);
if(ok) setVal(d);
return ok;
  }
};

на строке, где
if(ok) setVal(d);
компилятор пишет cannot convert parameter 1 from 'double' to 'QString'
Почему функция setVal в классе B не перегружается а замещается новой версией функции? Как сделать так читобы перегружалась?


Название: Re: Перегрузка методов при наследовании класса
Отправлено: Авварон от Июль 09, 2009, 15:19
тема уже поднималась, читайте стандарт с++. Укажи явно область видимости


Название: Re: Перегрузка методов при наследовании класса
Отправлено: lit-uriy от Июль 09, 2009, 15:21
>>не перегружается а замещается новой версией функции?
А что ты понимашь под перегрузкой в данном случае?


Название: Re: Перегрузка методов при наследовании класса
Отправлено: dr_Begemot от Июль 09, 2009, 15:25
>>не перегружается а замещается новой версией функции?
А что ты понимашь под перегрузкой в данном случае?

У класса B будут 2 функции setVal с разными параметрами


Название: Re: Перегрузка методов при наследовании класса
Отправлено: pastor от Июль 09, 2009, 15:27
на строке, где
if(ok) setVal(d);
компилятор пишет cannot convert parameter 1 from 'double' to 'QString'

Пиши так:

Код
C++ (Qt)
if(ok) A::setVal(d);


Название: Re: Перегрузка методов при наследовании класса
Отправлено: lit-uriy от Июль 09, 2009, 15:35
>>У класса B будут 2 функции setVal с разными параметрами
тогда их две и надо описать в классе B. Т.е. в классе A функцию setVal(double) сделать виртуальной, а в классе B создать setVal(QString).
Помоему так.


Название: Re: Перегрузка методов при наследовании класса
Отправлено: Winstrol от Июль 09, 2009, 15:56
Вопрос из топа всевозможных faqов ро C++
В классе B пишешь
using A::setVal;



Название: Re: Перегрузка методов при наследовании класса
Отправлено: f-r-o-s-t от Июль 09, 2009, 16:21
>>У класса B будут 2 функции setVal с разными параметрами
тогда их две и надо описать в классе B. Т.е. в классе A функцию setVal(double) сделать виртуальной, а в классе B создать setVal(QString).
Помоему так.

У виртуальной функции параметры должны быть одинаковые .

pastor предложил лучшие решение.


Название: Re: Перегрузка методов при наследовании класса
Отправлено: lit-uriy от Июль 09, 2009, 16:47
>>У виртуальной функции параметры должны быть одинаковые .
тут я предположил такое поведение (не эксперт к сожалению)
Виртуальную setVal(double) мы не описываем в наследнике, т.е. она какбы уза нас описана.
И создаём setVal(QString), как перегруженую версию setVal(double) в классе В.

тогда, получаем две функции setVal(...) в классе В.

Возможно, я не прав.


Название: Re: Перегрузка методов при наследовании класса
Отправлено: f-r-o-s-t от Июль 09, 2009, 16:51
В том то и дело что виртуальная функция не перегружается, т.е. если в наследнике мы объявляем её с другими параметрами она заменяет функцию предка совсем, а не перегружается. =)