Russian Qt Forum
Ноябрь 23, 2024, 20:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перегрузка методов при наследовании класса  (Прочитано 10130 раз)
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 не перегружается а замещается новой версией функции? Как сделать так читобы перегружалась?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июль 09, 2009, 15:19 »

тема уже поднималась, читайте стандарт с++. Укажи явно область видимости
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Июль 09, 2009, 15:21 »

>>не перегружается а замещается новой версией функции?
А что ты понимашь под перегрузкой в данном случае?
Записан

Юра.
dr_Begemot
Гость
« Ответ #3 : Июль 09, 2009, 15:25 »

>>не перегружается а замещается новой версией функции?
А что ты понимашь под перегрузкой в данном случае?

У класса B будут 2 функции setVal с разными параметрами
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июль 09, 2009, 15:27 »

на строке, где
if(ok) setVal(d);
компилятор пишет cannot convert parameter 1 from 'double' to 'QString'

Пиши так:

Код
C++ (Qt)
if(ok) A::setVal(d);
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 09, 2009, 15:35 »

>>У класса B будут 2 функции setVal с разными параметрами
тогда их две и надо описать в классе B. Т.е. в классе A функцию setVal(double) сделать виртуальной, а в классе B создать setVal(QString).
Помоему так.
Записан

Юра.
Winstrol
Гость
« Ответ #6 : Июль 09, 2009, 15:56 »

Вопрос из топа всевозможных faqов ро C++
В классе B пишешь
using A::setVal;

Записан
f-r-o-s-t
Гость
« Ответ #7 : Июль 09, 2009, 16:21 »

>>У класса B будут 2 функции setVal с разными параметрами
тогда их две и надо описать в классе B. Т.е. в классе A функцию setVal(double) сделать виртуальной, а в классе B создать setVal(QString).
Помоему так.

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

pastor предложил лучшие решение.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Июль 09, 2009, 16:47 »

>>У виртуальной функции параметры должны быть одинаковые .
тут я предположил такое поведение (не эксперт к сожалению)
Виртуальную setVal(double) мы не описываем в наследнике, т.е. она какбы уза нас описана.
И создаём setVal(QString), как перегруженую версию setVal(double) в классе В.

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

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

Юра.
f-r-o-s-t
Гость
« Ответ #9 : Июль 09, 2009, 16:51 »

В том то и дело что виртуальная функция не перегружается, т.е. если в наследнике мы объявляем её с другими параметрами она заменяет функцию предка совсем, а не перегружается. =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.178 секунд. Запросов: 23.