Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса

21.08.2016, 14:07. Показов 2239. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и я

Все кто хочет попробовать дать ответ помещайте его под спойлер

Задача: дан вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Parent {
public:
    virtual void doSmth(void) = 0;
};
class Children {
    int x;
public:
    Children() : x(101) {}
    void doSmth(void) {
        std::cout << x << std::endl;
    }
};
Есть абстрактный класс Parent в котором если чисто виртуальный метод, класс наследник реализует этот метод и выводит в консоль значение его приватной переменной x, цель сделать так чтобы реализация метода doSmth оставалась в родительском классе, но выполняло ту же функцию, т.е выводило значение переменной дочернего класса.

Вот "болванка" кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Parent {
public:
    void doSmth(void) {
        //вывести тут значение переменной x
    }
};
 
class Children: public Parent {
private:
    int x;
public:
    Children() {
        x = 101;
    }
};
Ограничения:
1. Нельзя делать родительский класс шаблонным.
2. Нельзя делать родительский класс наследником кого либо т.е. такое не допустимо
C++
1
2
3
class Parent : public someOtherClass {
//...
};
3. Нельзя передавать любые аргументы функции doSmth


Подсказка: это реализация одной из идиом с++

P.S Обращение к модераторам, возможно я плохо или где то ошибочно сформулировал задачу, если возникнут проблеммы, то в таком случае просьба подправить задание
P.P.S Гуру не спешите с ответом, дайте новичкам подумать
 Комментарий модератора 
В названии темы должно быть указано что в ней, а не для кого она.
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2016, 14:07
Ответы с готовыми решениями:

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?

Проверка установленного класса родителя из дочернего элемента в Delphi
procedure TForm1.Button5Click(Sender: TObject); var CodeStr : string; begin CodeStr := 'var g =...

Как скопировать объект дочернего класса из динамической памяти в указатель родителя?
class Parent { }; class Child : public Parent { public: int x; }; int main() { Child* child = new Child(); ...

15
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
21.08.2016, 14:13
Кликните здесь для просмотра всего текста
Цитата Сообщение от obivan Посмотреть сообщение
Гуру не спешите с ответом, дайте новичкам подумать
ок.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 14:23
Лучший ответ Сообщение было отмечено obivan как решение

Решение

Хорошо, что я не гуру)))
Кликните здесь для просмотра всего текста
Тут возможно ответ не смотри!!!
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// паттерн шаблонный метод
// [url]http://cpp-reference.ru/patterns/behavioral-patterns/template-method/[/url]
 
#include <iostream>
using namespace std;
 
class Parent
{
protected:
    virtual int getX() const = 0;
public:
    void doSmth( void )
    {
        cout << getX() << endl;
    }
};
 
class Children : public Parent
{
private:
    int x;
 
    virtual int getX() const    { return x; }
public:
    Children()
    {
        x = 101;
    }
};
 
int main()
{
    Parent* ptr = new Children();
    ptr->doSmth();
}

3
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
21.08.2016, 14:23
Кликните здесь для просмотра всего текста
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
паттерн шаблонный метод
больше подойдет "non-virtual interface"
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 14:26
HelicopterK52,
Кликните здесь для просмотра всего текста
Also Known As[edit]
Template Method - a more generic pattern, from the Gang of Four's Design Patterns book.
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
21.08.2016, 14:26  [ТС]
HelicopterK52, быстро под спойлер ! Если что оба ответа правильные я мучался дня 2 и сделал так как предложил HelicopterK52, ваш правильный rikimaru2013
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 14:28
Цитата Сообщение от obivan Посмотреть сообщение
сделал так как предложил HelicopterK52
Он ничего не предложил!! Он просто сидит критикует мои слова - как всегда xD
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
21.08.2016, 14:29  [ТС]
rikimaru2013,
Кликните здесь для просмотра всего текста

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Он ничего не предложил!!
я имел ввиду что я в универе при такой задаче дошел до решения с NVI :)

0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
21.08.2016, 14:29
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Он ничего не предложил!
Я предложил как раз-таки, только без кода. Код предоставил написать Вам.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Он просто сидит критикует мои слова
В каком месте? Я предложил реализовать чуть по-другому.
0
21.08.2016, 14:35

Не по теме:

rikimaru2013, Я был близок к такому же варианту. Но Вы меня опередили. :)

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 14:36
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Я предложил реализовать чуть по-другому.
Игнорьте 5 пост как можно дольше тогда
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
21.08.2016, 14:42
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Игнорьте 5 пост как можно дольше тогда
Для вас выделю даже
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
a more generic pattern, from the Gang of Four's Design Patterns book.
А то, видимо, Вы не в состоянии сами понять.
В общем, с Вами разговор окончен. Вы постоянно всё принимаете на свой счет, и складывается ощущение, что сами в себя не верите и думаете, что все Вас пытаются заткнуть, унизить, обмануть, критиковать. Вы непробиваемый.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 14:46
Один паттерн - два имени. Сравни примеры - это одно и тоже. Понял, что не прав - начал писать бред, да?)
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
21.08.2016, 14:48
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Сравни примеры - это одно и тоже.
http://www.e-reading.club/chap... e_CPP.html
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,237
22.08.2016, 21:19
Хочу вернуться к задаче.

На мой взгляд в ней логическая ошибка проектирования.
Откуда базовый класс знает, что в производном классе появится переменная x?
А если знает, что что мешает ее завести в базовом классе.

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

Т.о. считаю данную задачу негодной для распространения в таком виде!
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
22.08.2016, 21:35
Цитата Сообщение от zss Посмотреть сообщение
Базовый класс может требовать от производного некоторой функциональности,
но никак не создания неких переменных.
Могу навести пример, когда библиотека предоставляет интерфейс, клиент создает экземпляр наследника апи либы и видит, что либа просит реализовать методы const Foo& getFoo() = 0;. Зачем? Чтобы не либа создавала переменные в куче, а клиент мог создать объект у себя в самописном пуле и отдать на использование либы. Такой подход применяется не часто, но там где трубуется мощь С++ вполне, в частности в game dev
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2016, 21:35
Помогаю со студенческими работами здесь

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Создать класс наследник от класса TForm1. Определить конструктор без параметров для дочернего класса
Доброго всем времени суток. Помогите решить проблемку. Хочу создать класс наследник от класса TForm1. Делаю это (наследование) для...

Вызов слота класса потомка при вызове сигнала класса родителя
Всем привет. Ситуация следующая. Есть класс родитель &quot;class1&quot;. В нём объявлен и вызывается сигнал &quot;signal&quot;. Есть класс...

Передача управления из конструктора класса-родителя в конструктор класса-потомка
Здравствуйте. Возможно ли передать управление из конструктора класса-родителя в конструктор класса-потомка? Например, есть класс...

Правда, что указатель класса-наследника не может указывать на объект класса-родителя?
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru