Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перегрузка методов базового класса в производном  (Прочитано 14518 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
haker-kirik
Гость
« : 22-04-2008 22:43 » 

Возникла следующая проблема:
Код:
#include <iostream>

using namespace std;

class Base
{
public:
void func()
{
cout << "Class Base";
}
};

class Der : public Base
{
public:
void func(int a)
{
cout << "Class Der";
}
};

int main()
{
Der d1;
d1.func(3);
d1.func();  // <- здесь ошибка (нет такого метода)
cin.get();
return 0;
}
Почему невозможно перегрузить метод базового класса? Здесь была моя ладья... Или я где-нибудь ошибся...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 23-04-2008 03:05 » 

вообще то, ты функцию её переопределил, а не перегрузил (не виртуальная)

а ошибка там в том, что function does not take 0 parameters  для Der::func

может так нужно
Код:
class Base
{
public:
void func()
{
cout << "Class Base";
}
};

class Der : public Base
{
public:
void func(int a)
{
cout << "Class Der";
}

void func()
{
Base::func();
}

};
« Последнее редактирование: 23-04-2008 03:09 от Алексей1153++ » Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 23-04-2008 04:28 » 

У меня есть сомнения по поводу целесообразности самой конструкции Улыбаюсь
C++ сопротивляется наследованию ради наследования (а точнее, расширения) функциональности Улыбаюсь) Вообще, у тех же Александреску с Саттером в "Стандартах программирования на C++" рекомендуется предпочитать композицию такому наследованию и не наследовать от неприспособленных классов (рекомендации 34 и 35) Улыбаюсь Здесь, например, непонятно, для чего таким образом расширяется функциональность - полиморфизм всё равно не удастся использовать в случае применения функции с параметром, а других причин для такой тесной связи не видно.

haker-kirik, расскажи, зачем тебе нужна такая конструкция Улыбаюсь
« Последнее редактирование: 23-04-2008 04:30 от Вад » Записан
haker-kirik
Гость
« Ответ #3 : 23-04-2008 06:31 » 

Алексей1153++, я думал переопределением называется определение метода в производном классе, который имеет одно и тоже название и одинаковое число аргументов того же типа, что и в базовом классе.
Вад, я сейчас изучаю С++, делаю задачки в конце каждой главы. в общем задача такого плана: есть класс Base, в нем определены методы для работы унарных префиксных операторов "++" и "--". Необходимо расширить функционал класса Base путем добавления методов для работы постфиксных операторов. Для этого необходимо создать производный класс.
Выходит кроме как композицией задачу не решить? Не понял
« Последнее редактирование: 23-04-2008 06:40 от haker-kirik » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 23-04-2008 06:43 » 

Я, кроме варианта Алексея, разве только до такого варианта додумался:
Код:
class Der : public Base
{
public:
using Base::func;
void func(int a)
{
cout << "Class Der";
}
};
Улыбаюсь
Записан
haker-kirik
Гость
« Ответ #5 : 23-04-2008 07:05 » 

Вад, т.е. если у меня в базовом классе будет около 100 методов, то предпочтительней всё же воспользоваться включением? Т.к. подключать все методы, свойства и поля  - как-то проблематично... Как быть в таком случае? Просто хотелось бы знать технологию решения даной задачи "по стандарту".
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 23-04-2008 07:06 » 

haker-kirik, если у тебя в базовом классе будет 100 публичных переопределяемых в потомке методов, то наверное ты плохо спроектировал класс Улыбаюсь
Записан
haker-kirik
Гость
« Ответ #7 : 23-04-2008 07:17 » 

Вад, на последнем посте я немного ступил. Мне показалось, что через using надо все методы подключать к своему классу, чтоб их было видно Улыбаюсь А так всё отлично работает. Спасибо! 
« Последнее редактирование: 23-04-2008 07:37 от haker-kirik » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 23-04-2008 12:42 » 

Цитата: Вад
если у тебя в базовом классе будет 100 публичных переопределяемых в потомке методов, то наверное ты плохо спроектировал класс
Не будет. Это, как у Купера было, особенность мышления программиста, для которого существуют только три числа: 0, 1 и бесконечно много. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines