Форум программистов, компьютерный форум CyberForum.ru

Можно ли как-то в дочернем классе получить указатель родителя? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
newbie666
Заблокирован
09.04.2014, 17:11     Можно ли как-то в дочернем классе получить указатель родителя? #1
У меня тут появилась мыслишка
В любом классе есть так сказать скрытый указатель на самого себя - this, а можно ли как то получить в дочернем классе указатель на родительский класс?
P.S.: без всякой явной передачи в конструктор дочернего класса указателя на базовый ...

Добавлено через 12 минут
ладно, опять же забейте, просто было интересно, есть ли возможность в дочернем классе получить указатель на базовый и присвоить какое то значение по этому указателю, например:
(конструктор дочернего)
C++
1
2
3
4
Child()
{
   (Base*)this->x = 4;
}
ну конечно же так не работает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 17:11     Можно ли как-то в дочернем классе получить указатель родителя?
Посмотрите здесь:

Не могу в дочернем классе вызвать protected метод C++
Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе C++
C++ Запуск конструктора родителя в дочернем конструкторе
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
C++ R6025 pure virtual function call при вызове метода, реализованного в дочернем классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 09:23     Можно ли как-то в дочернем классе получить указатель родителя? #21
Цитата Сообщение от newbie666 Посмотреть сообщение
Тоесть неудобно, я хотел работать вообще без стрелочек
Можно инкапсулировать это в метод. Назвать его base, чтобы он возвращал всегда самый базовый объект независимо от уровня.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
10.04.2014, 10:44  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #22
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно инкапсулировать это в метод. Назвать его base, чтобы он возвращал всегда самый базовый объект независимо от уровня.
А... забей, всё равно нельзя сделать так, чтоб дочерний объект автоматический наследовал бы не явно все свойства базового объекта, как происходит при наследование классов... Так что это всё бутафория ... поехали
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 11:12     Можно ли как-то в дочернем классе получить указатель родителя? #23
Цитата Сообщение от newbie666 Посмотреть сообщение
всё равно нельзя сделать так, чтоб дочерний объект автоматический наследовал
Это все потому, что в этой формулировке задачи нет. Нет никакого смысла в программировании без задачи. Наверняка трудности с которыми ты столкнулся имеют логичное и простое разрешение, а ты просто пошел не по тому пути и он привел тебя в тупик. Одно из необходимых качеств любого хорошего инженера заключается в том, что если ты пришел в тупик, оглянуться назад и пересмотреть подход к задаче, а возможно даже все переделать. Я это к тому, что очень плохо для саморазвития грешить на инструмент (мол он чего-то там не может), и очень хорошо грешить на себя (инструмент неправильно применен). Если признаться самому себе, что на каком-то этапе совершил ошибку, то способ нахождения истинного пути - дело техники. Так быстрее будет расти мастерство.
newbie666
Заблокирован
10.04.2014, 11:35  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #24
Цитата Сообщение от DrOffset Посмотреть сообщение
Я это к тому, что очень плохо для саморазвития грешить на инструмент (мол он чего-то там не может), и очень хорошо грешить на себя (инструмент неправильно применен)
это всё понятно, но инструмент С++ постоянно совершенствуется с каждым стандартом, причём не без участия программистов, которые пишут свои пожелания парням по стандартизации С++... По этому я б тоже написал им про фишки, которые хочу добавить в язык )))
Цитата Сообщение от DrOffset Посмотреть сообщение
Это все потому, что в этой формулировке задачи нет.
Ну почему же нет, смотри, есть... сто раз уже говорил, хочу присоединить класс к уже существующей цепи наследования... Ладно, внатуре забей Я тут подумал, что ведь в дочернем классе присутствует всё барахло их всех родительских , если делать кучу подобных присоединений, получишь крутой оверхэд по памяти ... Бред в общем. Наследование - это вообще по сути такая немного бесполезная штука, которая нужна по сути только в проектах, над которыми работают сотни кодеров, чтоб типа один хрен написал класс с каким то функционалом, а другой прогер унаследовался от этого класса и получил профит в уже существующем готовом функционале предыдущего прогера, типа разделение обязанностей ... Хотя вот в C# есть полезная штука - parial классы... ну да ладно ....
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 12:44     Можно ли как-то в дочернем классе получить указатель родителя? #25
Цитата Сообщение от newbie666 Посмотреть сообщение
По этому я б тоже написал им про фишки, которые хочу добавить в язык
На одном изместном российском форуме программистов не так давно был один товарищ из комитета (Николай Ивченков). И вот он говорил, что большая часть предложений - это ерунда. Потому что авторам не хватает знаний или выдержки составить непротиворечивое требование. Чтобы оно со всех сторон не ломало существующую систему и логику. Да и само было логичным. Учитывай это. Для того, чтобы это сделать - нужно досконально знать стандарт языка. А когда ты будешь его знать настолько, то половина твоих предложений уйдет сама собой.
Я очень много видел в инете подобных тем, где кто-то пытался обвинить язык в недостаточной полноте и отсуствии фич, однако недостаточно просто сказать "хочу вот это!". Нужно же это обосновать. Рассмотреть в комплексе с остальными возможностями языка. Как правило, заявления таких товарищей не выдерживали критики, просто хотя бы потому, что предложивший не до конца разобрался в языке.
Именно поэтому стандарты принимают так долго. Это длительный процесс проверки и обсуждений со всех сторон.

Цитата Сообщение от newbie666 Посмотреть сообщение
сто раз уже говорил, хочу присоединить класс к уже существующей цепи наследования
Это было бы задачей, если бы ты рассказал что эта цепь наследования отражает (какие сущности). Какие проблемы она решает. В какой предметной области. В чем, короче, ее смысл. Чтобы можно было связать объекты реального мира и твой код. А если ты говоришь: "у меня есть иерархия, хочу добавить туда еще что-то" - это просто код, а не задача.
К примеру моя иерархия с самолетами. Она отражает конструктивные дополнения к первоначальному проекту. Задача состоит в том, чтобы имея базовую конструкцию, получить на основе ее модификации. При этом пилоты (те, кто используют класс). которые работали с базовой конструкцией не должны испытывать трудностей, работая с теми же узлами в модифицированной (интерфейс наследуется, изменяется только реализация). То есть тут понятно. вот есть парк моделей, построенных на базе одной базовой, и есть некто, кто работает с ними (механики, пилоты и т.д.).
Ведь от деталей задачи зависит то, как ее надо решать. Правда ведь?

Цитата Сообщение от newbie666 Посмотреть сообщение
Ладно, внатуре забе
Да я и забил. Просто беседую с тобой.

Цитата Сообщение от newbie666 Посмотреть сообщение
Наследование - это вообще по сути такая немного бесполезная штука
Главный профит в наследовании - это полиморфизм. А эта штука много где применяется.
newbie666
Заблокирован
10.04.2014, 15:43  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #26
Цитата Сообщение от DrOffset Посмотреть сообщение
Главный профит в наследовании - это полиморфизм. А эта штука много где применяется.
ну приведи пример хоть один где это реально нужно
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 17:46     Можно ли как-то в дочернем классе получить указатель родителя? #27
Цитата Сообщение от newbie666 Посмотреть сообщение
ну приведи пример хоть один где это реально нужно
Любая задача, в которой требуется единообразно взаимодействовать с объектами разных, но родственных типов. Я уже приводил пример выше с самолетами. Допустим, эти объекты часть какой-то системы моделирования полета. Объект пилот инициирует взлет, но у самолета А, может быть, например вертикальный взлет, а у самолета Б - обычный по взлетной полосе. Каждый метод взлета в своем классе реализуется нужным образом. Однако интерфейс один: "взлететь". не было бы полиморфизма, пришлось бы писать if`ы с проверкой. А если обобщить систему до просто "летательных аппаратов" с полиморфизмом, то появились бы и другие аппараты, со своими способами взлета, а вызывающий код, инициирующий взлет, не нужно было бы менять. А были бы if'ы - вылилось бы в доработку еще и вызывающего кода.
newbie666
Заблокирован
10.04.2014, 17:55  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #28
да ерунда это всё, т.к. это нужно чисто для интерфейсных абстрактных классов, которые просто жёстко устанавливают те функции, которые нужно реализовать, типа чтоб ты не забыл
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 18:41     Можно ли как-то в дочернем классе получить указатель родителя? #29
Цитата Сообщение от newbie666 Посмотреть сообщение
да ерунда это всё
Аргументы?
Как бы ты стал решать задачу?

Добавлено через 10 минут
Еще пример, реальный - реализация MVC в Qt. Модель - полиморфный тип, Представление дергает интерфейсные методы, а внутри они могут хоть таблицу, хоть дерево, хоть из базы, хоть из файла, хоть из сети. Причем всегда можно написать свою модель, которая реализует то, что требуется. Полиморфизм, однако.
Твой способ, как это реализовать по-другому?
newbie666
Заблокирован
10.04.2014, 20:57  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #30
Цитата Сообщение от DrOffset Посмотреть сообщение
Твой способ, как это реализовать по-другому?
да как как, пользователю то похрену как там чё внутри Qt устроено, он вызывает методы какого - то общего, как ты говоришь, полиморфного класса, а дальше уже реализация идёт под сеть, под базу и тд разная. Ну совсем не обязательно делать базовый интерфейсный класс, методы которого для удобства тебе будут напоминать реализовать во всех дочерних классах, будь то под сеть, под базу и тд.... Но какой в этом смысл? Делаешь один класс, где есть те же методы, например "дай мне" и "возьми от меня", кроме которых, на данном простом примере, допустим юзеру ничего не надо. Далее делаешь функцию в классе - типа SetType, в которой указываешь тип коннекта или чего то там, откуда брать данные в общем и в зависимости от этого типа класс будет вызвать свои те или иные функции. Можешь функции разнести по разным классам, тогда основной класс будет создавать объект того или иного типа в зависимости от выбранного пользователем типа коннекта ...

Добавлено через 59 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Как бы ты стал решать задачу?
да никак - самолёты слишком простая задача, которая пишется в рамках одного класса )))
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 21:40     Можно ли как-то в дочернем классе получить указатель родителя? #31
Цитата Сообщение от newbie666 Посмотреть сообщение
Можешь функции разнести по разным классам, тогда основной класс будет создавать объект того или иного типа в зависимости от выбранного пользователем типа коннекта ..
В этом и соль. Как организовать этот выбор? Через if или switch? И что, при добавлении нового типа источника данных каждый раз лопатить этот код и добавлять? К тому же - этот код библиотечный (представление). А модель мы пишем сами. Как библиотека узнает о твоем типе, если ты его сам написал, не пользуясь наследованием как бесполезной вещью? И как она сможет его распознать, если проверки на этот тип там нет. Ну да, можно передавать вместе с типом еще и функцию (callback), которая разберется как выбрать. Мы все усложняем и усложняем код, а задача-то не решается. И когда мы все это реализуем, преодолев все трудности и игнорируя наследование, то мы обнаружим, сюрприз, что реализовали полиморфизм. Только своими руками.
А про обязательность абстрактных классов никто не говорил. Я говорил про полиморфизм в целом.

Цитата Сообщение от newbie666 Посмотреть сообщение
да никак - самолёты слишком простая задача, которая пишется в рамках одного класса )))
Это еще почему? Разве в мире существует только один самолет? Или ты предлагаешь все характеристики задавать состоянием? Но это дикая избыточность. Кроме того это потенциально может нарушить инвариант. Если заданные значения противоречат друг другу при компоновке объекта значениями (например выбрали материал - дерево, а двигатель - реактивную турбину). Понадобится писать дополнительный код проверки, чтобы не допускать такого. В общем опять сложности на пустом месте. Ведь мы ничего не выигрываем таким подходом.
newbie666
Заблокирован
10.04.2014, 21:56  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #32
Цитата Сообщение от DrOffset Посмотреть сообщение
В этом и соль. Как организовать этот выбор?
ну вот покажи мне пример из пары строк, где это необходимо ... про что ты тут пишешь ....
P.S.: про самолёты - ноу коммент, комменты будут когда покажешь хоть пару строк кода с классами, где реально необходимо наследование и без него никак или как - но сложнее ...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
10.04.2014, 21:58     Можно ли как-то в дочернем классе получить указатель родителя? #33
Цитата Сообщение от newbie666 Посмотреть сообщение
пользователю то похрену как там чё внутри Qt устроено
А Qt писали не люди? Это такая данность свыше, материализовавшаяся сама по себе?
Внезапно библиотеки тоже пишутся людьми. И написать более-менее универсальную библиотеку, которую можно использовать в разных приложениях, задача не всегда простая.

Цитата Сообщение от newbie666 Посмотреть сообщение
Ну совсем не обязательно делать
Продолжая рассуждения, можно вообще весь код написать в main. Только как потом это поддерживать?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
10.04.2014, 22:08     Можно ли как-то в дочернем классе получить указатель родителя? #34
Цитата Сообщение от newbie666 Посмотреть сообщение
ну вот покажи мне пример из пары строк, где это необходимо
Ты же говорил, что Qt знаешь. Открой любой пример на MVC и посмотри. Преимущество в том, что полиморфные вызовы не накладывают на библиотеку обязанности знать что за тип на самом деле используется. Это очень удобно и все остальные варианты банально технически сложнее. Но даже после реализации без наследования и виртуальности - получится тот же самый полиморфизм, только врукопашную (да, полиморфизм на if`ах).

Или ты хочешь такой пример, который вообще без виртуальных функций и наследования реализован быть не может в принципе? Ну так ты это, вспомни про то, что полиморфизм - это общее понятие. Оно даже к языку не привязано - это понятие из ООП. Поэтому любая такая задача, в которой есть работа с разнородными данными одинаковым образом, - сведется к полиморфизму. Просто на С - это будет больше кода и указатели на функции в таблицах. А на С++ есть готовый инструмент в виде наследования и виртуальных вызовов. Поэтому не понято с чего бы нам, имея инструмент, городить свои if`ы и(или) таблицы вызовов.

Ну и я уже привел тебе пример свой, он тебе чем-то не подошел. Но и варианта своего ты не предложил.
newbie666
Заблокирован
10.04.2014, 22:24  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #35
с утра отпишусь, но пока аргументы в пользу полиморфизма, нежели в пользу какого - то оптимального паттерна для конкретной задачи, выглядят сомнительно ....
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты же говорил, что Qt знаешь.
Где это я говорил? Но Qt я всё таки знаю

Вот можно реально пример какой - нибуть хотя бы на двух трёх классах из пары строк, где было бы видно, что О-О да, тут с полиморфизмом реально круче, удобней и меньше строк кода ....
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
11.04.2014, 10:30     Можно ли как-то в дочернем классе получить указатель родителя? #36
Цитата Сообщение от newbie666 Посмотреть сообщение
нежели в пользу какого - то оптимального паттерна
Ты хотя бы один паттерн-то назови?
Цитата Сообщение от newbie666 Посмотреть сообщение
выглядят сомнительно
То есть ты никогда не применял этот подход? Если не применял, то тогда не понятна твоя уверенность в соей правоте.

Цитата Сообщение от newbie666 Посмотреть сообщение
Но Qt я всё таки знаю
Ну так в чем проблема поcмотреть на MVC?

Добавлено через 30 минут
newbie666,
Ну на вот тебе пример. Основная идея в main();
С полиморфизмом.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class FlyingMachine
{
public:
    virtual void tryToFly(Pilot const &) = 0;
};
 
class Helicopter : public FlyingMachine
{
public:
    Helicopter(Position const & pos)
        : engine_()
        , rotor_(engine_), tailRotor_(engine_)
        , ctrl_(engine_, rotor_, tailRotor_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилом проверяет систему
        pilot.enable(ctrl_, HeliControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, HeliControlPanel::startEngine);
        // ждем нужной скорости
        pilot.wait(ctrl_, HeliControlPanel::setEngineTakeoffMode); 
        // тяга вверх,
        pilot.enable(ctrl_, HeliControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, HeliControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboShaft engine_;
 
    Rotor     rotor_;
    TailRotor tailRotor_;
 
    HeliControlPanel ctrl_;
};
 
class Aeroplane : public FlyingMachine
{
public:
    Aeroplane(Position const & pos)
        : leftEngine_(), rightEngine_()
        , ctrl_(leftEngine_, rightEngine_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        pilot.busy();
 
        // пилом проверяет систему
        pilot.enable(ctrl_, JetControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::startEngine);
        // перевод двигателя в режим взлета
        pilot.enable(ctrl_, JetControlPanel::setEngineTakeoffMode);
        // разгон и ожидание набора нужной скорости
        pilot.wait(ctrl_, JetControlPanel::racing);
        // выпустить закрылки
        pilot.enable(ctrl_, JetControlPanel::releaseFlaps);
        // тяга вверх
        pilot.enable(ctrl_, JetControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, JetControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboJet leftEngine_;
    TurboJet rightEngine_;
 
    JetControlPanel ctrl_;
};
 
// Теперь использование
int main()
{
    // некая функция, возвращает эскадрилью летательных аппаратов
    std::vector<FlyingMachine *> squadron = takeSquadron();
    // запустим их в воздух
    // для простоты не сажаю их непосредственно в машину, хотя можно было бы,
    // только кода станет больше.
    for(size_t i = 0, size = squadron.size(); i < size; ++i)
    {
        Pilot & pilot = getFreePilot(); // получим свободного
        squadron[i]->tryToFly(pilot);
        pilot.busy(); // занят
    }
    // Мы можем спокойно добавлять любые аппараты в эскадрилью - этот код не нужно будет менять
}

Без полиморфизма (на самом деле он там есть, только реализованный вручную).

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Теперь без наследования и полиморфизма,
// классы оставляю прежними, только убираю наследование и базовый класс
 
class Helicopter
{
public:
    Helicopter(Position const & pos)
        : engine_()
        , rotor_(engine_), tailRotor_(engine_)
        , ctrl_(engine_, rotor_, tailRotor_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилот проверяет систему
        pilot.enable(ctrl_, HeliControlPanel::checkSystem); // throws system_error, если ошибка
        // запуск двигателя
        pilot.enable(ctrl_, HeliControlPanel::startEngine); // throws engine_fail, если отказ движка
        // ждем нужной скорости
        pilot.wait(ctrl_, HeliControlPanel::setEngineTakeoffMode); //включаем взлетный режим
        // тяга вверх,
        pilot.enable(ctrl_, HeliControlPanel::up); // throws flying_fail, если внезапное препятствие
        // режим полета
        pilot.enable(ctrl_, HeliControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboShaft engine_;
 
    Rotor     rotor_;
    TailRotor tailRotor_;
 
    HeliControlPanel ctrl_;
};
 
class Aeroplane
{
public:
    Aeroplane(Position const & pos)
        : leftEngine_(), rightEngine_()
        , ctrl_(leftEngine_, rightEngine_)
    { }
 
    void tryToFly(Pilot const & pilot)
    {
        // пилот проверяет систему
        pilot.enable(ctrl_, JetControlPanel::checkSystem);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::startEngine);
        // запуск двигателя
        pilot.enable(ctrl_, JetControlPanel::setEngineTakeoffMode);
        // разгон и ожидание набора нужной скорости
        pilot.wait(ctrl_, JetControlPanel::racing);
        // выпустить закрылки
        pilot.enable(ctrl_, JetControlPanel::releaseFlaps);
        // тяга вверх
        pilot.enable(ctrl_, JetControlPanel::up);
        // режим полета
        pilot.enable(ctrl_, JetControlPanel::setEngineFlyMode);
    }
 
private:
// system
    TurboJet leftEngine_;
    TurboJet rightEngine_;
 
    JetControlPanel ctrl_;
};
 
// Теперь использование
int main()
{
    // здесь первая трудность, как этот список вернуть в одном массиве?
    // Можно выкрутиться, написав класс FlyingMachineHolder, пусть он хранит тип аппарата и указатель на него (void*)
 
    // некая функция, возвращает эскадрилью летательных аппаратов
    std::vector<FlyingMachineHolder> squadron = takeSquadron();
    // запустим их в воздух
    // для простоты не сажаю их непосредственно в машину, хотя можно было бы.
    // Только кода станет больше.
    for(size_t i = 0, size = squadron.size(); i < size; ++i)
    {
        Pilot & pilot = getFreePilot(); // получим свободного
 
        switch(squadron[i].type())
        {
        case M_HELICOPTER:
            // преобразование можно запихать в шаблон (без него будет еще хуже)
            // шаблоны ведь можно использовать? :)
            squadron[i].toConcreteMachine<Helicopter>()->tryToFly(pilot);
            break;
        case M_AERORPLANE:
            squadron[i].toConcreteMachine<Aeroplane>()->tryToFly(pilot);
            break;
        }
        pilot.busy(); // занят
    }
    // Если у нас таких аппаратов хотя бы 15 разных, то switch вырастет еще на 13 веток.
}

Модель упрощена, иначе придется реализовывать слишком много. Всего лишь демонстрация.
Это нужно учитывать.
Классы Pilot и характеристики внутренностей воздушных судов и т.д. не привожу, их реализация не влияет на идею.
Способы взлета вертолета и самолета разные. Алгоритм, который назначает машины к взлету не обязан знать про это. Так же как и диспетчеру все равно на какие конкретные кнопки нажимает пилот, главное чтобы он соблюдал нормы полета. Первый пример устойчив к расширению парка машин, второй - нет. Это основное и главное преимущество.
Код не компилируемый, предназначен для демонстрации идеи и все.
newbie666
Заблокирован
11.04.2014, 10:52  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #37
DrOffset, не ну ты уж меня за нуба то не держи, несмотря на мой ник
Что такое полиморфизм я прекрасно знаю.
Но вот например, как быть с полиморфизмом, ну допустим даже с твоими флаинг машинами, если им нужно обмениваться данными между друг другом?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
11.04.2014, 11:41     Можно ли как-то в дочернем классе получить указатель родителя? #38
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от newbie666 Посмотреть сообщение
Но вот например, как быть с полиморфизмом, ну допустим даже с твоими флаинг машинами, если им нужно обмениваться данными между друг другом?
В общем случае через двойную диспетчеризацию например.

На примере же летательных апаратов: какими данными могут они обмениваться? Обычно это радиосвязь. Ну тут все просто. Есть общий канал, в каждом классе есть модуль "радиостанция". Радиостанция посылает в этот канал несколько параметров. Скажем частота, позывной адресата и сообщение. Класс "канал связи" инициирует передачу и другой летательный аппарат ловит сообщение через свою радиостанцию.
Даже если не применять наследование и полиморфизм, то здесь все равно придется делать третий класс, который занимается диспетчеризацией сообщений. Не хранить же ссылки на все адресаты внутри каждого объекта? Это опять же приведет к проблемам, если появляется новый объект, с которым нужно наладить связь.
newbie666
Заблокирован
11.04.2014, 11:50  [ТС]     Можно ли как-то в дочернем классе получить указатель родителя? #39
DrOffset, ладно, убедил, в некоторых случаях полиморфизм может дать профит
спасибо за потраченное время, поставлю ка я тебе во всех постах по плюсу ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 12:13     Можно ли как-то в дочернем классе получить указатель родителя?
Еще ссылки по теме:

C++ Ошибка в дочернем классе
C++ Перегрузка fstream в дочернем классе
Изменение информации в дочернем классе, через ссылку C++

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

Или воспользуйтесь поиском по форуму:
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
11.04.2014, 12:13     Можно ли как-то в дочернем классе получить указатель родителя? #40
Если надо изменить переменную базового класса разом для всех дочерних, то чем плохи static-члены?
Yandex
Объявления
11.04.2014, 12:13     Можно ли как-то в дочернем классе получить указатель родителя?
Ответ Создать тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru