Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
newbie666
Заблокирован
#1

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

09.04.2014, 17:11. Просмотров 3002. Ответов 40
Метки нет (Все метки)

У меня тут появилась мыслишка
В любом классе есть так сказать скрытый указатель на самого себя - this, а можно ли как то получить в дочернем классе указатель на родительский класс?
P.S.: без всякой явной передачи в конструктор дочернего класса указателя на базовый ...

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

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе - C++
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...

Запуск конструктора родителя в дочернем конструкторе - C++
Вобщем имеется два класса class Coma{ public: double x,y; Coma(){ x=0; y=0; } Coma(int x, int y){ this->x=x;

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Ошибка в дочернем классе - C++
Не могу найти ошибку в дочернем классе, возможно не правильно написать main Задание и код: Код нужно переписывать в сообщение Только...

Перегрузка fstream в дочернем классе - C++
h class Child:public StudentsBD{ friend fstream &operator<<( fstream& , string & ); friend fstream &operator>>( fstream& , string...

Изменение информации в дочернем классе, через ссылку - C++
Подскажите, есть класс class Class1 В конструкторе я создаю структуру, которая будет хранить в себе ссылки на все классы...

40
newbie666
Заблокирован
09.04.2014, 22:52  [ТС] #16
Цитата Сообщение от DrOffset Посмотреть сообщение
еще у тебя похоже проблемы с пониманием что же такое наследование в С++.
да не, проблем нет... Есть сожаление о некоторых не реализованных возможностях С++, которые часто обсуждаются на разных форумах - например вот мой вопрос про два наследника от одного класса и например - виртуалные конструкторы ... Ну да ладно....
Статью гляну - спс.
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
09.04.2014, 23:04 #17
newbie666, посмотри статью. Там есть ответы на эти вопросы.
Цитата Сообщение от newbie666 Посмотреть сообщение
Смотри, class Base , class Child : public base. Child *child = new Child; Как получить указатель на базовый класс экземпляра классы child ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base
{ };
class Child : public Base
{
public:
    Child() : Base() // Объект типа Base часть типа Child
    {}
};
 
int main()
{
    Child * child = new Child;
    Base  * base  = child; // автоматически приводится по правилам языка
}
Это указатель на его базовый класс. Базовый класс не шарится между потомками (и не должен), потому что у каждого потока свой экземпляр базового класса при создании объекта.

Добавлено через 8 минут
Цитата Сообщение от newbie666 Посмотреть сообщение
Есть сожаление о некоторых не реализованных возможностях С++
newbie666, слушай, ну правда. Это же уже не смешно Таких возможностей нет нигде, это смешивание кислого и пресного.
Давай на пальцах:
Есть Чертеж базовой модели самолета( чертеж B).
Есть модель, спроектированная на базе этого чертежа, назовем ее чертеж А.
Есть еще одна модель, усовершенствованная версия А, назовем чертеж А1.
Теперь мы строим экземпляр по чертежу А, получаем изделие а.
Потом строим экземпляр по чертежу А1, получаем изделие а1.
Теперь смотри, оба самолета взлетают и у a1 птица попадает в турбину и один из двигателей отказывает. Турбина является базовой конструкцией, которая сделана по чертежу B. Значит ли это, что у самолета а тоже сейчас произойдет возгорание этого двигателя? Конечно нет! Вот и ответ. Конструктивно они похожи (сделаны по одному базовому чертежу), однако изменяется состояние у каждого независимо (потому что это разные экземпляры).
2
newbie666
Заблокирован
09.04.2014, 23:11  [ТС] #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Это указатель на его базовый класс.
Ну вот допустим я получил у двух РАЗНЫХ экземпляров дочерних классов указатель на базовый класс. Можно как то связать эти указатели или присвоит одному указателю - другой.... чтоб связать два дочерних базовым? Тоесть чтоб я мог у любого дочернего получить указатель на базовый, поменять какую - то переменную в базовом классе и, проверив её в другом экземпляре дочернего класса, убедится что она идентична переменной в первом экземпляре класса, т.к. они связанны общий базовым классом ....

P.S.: ладно- надоело :) спасибо.. я спать ))))
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
09.04.2014, 23:35 #19
Цитата Сообщение от newbie666 Посмотреть сообщение
Тоесть чтоб я мог у любого дочернего получить указатель на базовый, поменять какую - то переменную в базовом классе и, проверив её в другом экземпляре дочернего класса, убедится что она идентична переменной в первом экземпляре класса, т.к. они связанны общий базовым классом ....
В том и фишка, что подобное отношение - это не наследование типов. Смотри пример с самолетами.
Наследуются типы, а значение ты меняешь у объекта. Вдумайся в это. Вот и получается, что чтобы такое организовать нужно иметь, например, два экземпляра, которые ссылаются на базовый:
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
class Base
{
public:
    Base() {}
};
 
class Child1
{
public:
    Child1(Base * p) : parent(p) {}
 
    Base * parent;
};
 
class Child2
{
public:
    Child2(Base * p) : parent(p) {}
 
    Base * parent;
};
 
int main()
{
    Base * base = new Base;
 
    Child1 * child1 = new Child1(base);
    Child2 * child2 = new Child2(base);
}
Внеся ссылку на базовый экземпляр мы обеспечили доступ к общему объекту (заметь, объекту). наследования тут пока вообще нет (специально).
А наследование типов здесь понадобится уже затем, чтобы получить возможность в качестве базового класса указывать один из потомков (т.к. все они будут приводимы к базе). Получаем вот:
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
class Base
{
public:
    Base(Base * p = 0) : parent(p) {}
 
    Base * parent;
};
 
class Child1 : public Base
{
public:
    Child1(Base * p) : Base(p) {}
};
 
class Child2 : public Base
{
public:
    Child2(Base * p) : Base(p) {}
};
 
int main()
{
    Base * base = new Base;
 
    Child1 * child1 = new Child1(base);
    Child2 * child2 = new Child2(child1);
 
    child2->parent; // это child1
    child2->parent->parent; // это base
}
То же самое, что и мой предыдущий пример. И это именно то, что ты описывал. Остальные вещи уточнятся должны уже исходя из конкретной задачи.

Добавлено через 3 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
виртуалные конструкторы
Virtual Constructor
1
newbie666
Заблокирован
10.04.2014, 08:26  [ТС] #20
ну у меня всё сейчас так же и реализовано, я вообще поднял тут уже несколько тредов только лишь для того, чтоб выяснить возможность подомных манипуляций с одним базовым классом, а нужно мне это всё чисто для удобства работы, так то похрену.....
Цитата Сообщение от DrOffset Посмотреть сообщение
ild2->parent->parent; // это base
- видишь, много стрелочек -> Тоесть неудобно, я хотел работать вообще без стрелочек, еслиб данные были как бы унаследованны в в класс.... Ладно, спасибо за потраченное время ... Оставлю у себя всё как есть ... (делаю супер online 3D Shooter / с элементами стратегии типа Ascendancy (DOS) )
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
10.04.2014, 09:23 #21
Цитата Сообщение от newbie666 Посмотреть сообщение
Тоесть неудобно, я хотел работать вообще без стрелочек
Можно инкапсулировать это в метод. Назвать его base, чтобы он возвращал всегда самый базовый объект независимо от уровня.
1
newbie666
Заблокирован
10.04.2014, 10:44  [ТС] #22
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно инкапсулировать это в метод. Назвать его base, чтобы он возвращал всегда самый базовый объект независимо от уровня.
А... забей, всё равно нельзя сделать так, чтоб дочерний объект автоматический наследовал бы не явно все свойства базового объекта, как происходит при наследование классов... Так что это всё бутафория ... поехали
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
10.04.2014, 11:12 #23
Цитата Сообщение от newbie666 Посмотреть сообщение
всё равно нельзя сделать так, чтоб дочерний объект автоматический наследовал
Это все потому, что в этой формулировке задачи нет. Нет никакого смысла в программировании без задачи. Наверняка трудности с которыми ты столкнулся имеют логичное и простое разрешение, а ты просто пошел не по тому пути и он привел тебя в тупик. Одно из необходимых качеств любого хорошего инженера заключается в том, что если ты пришел в тупик, оглянуться назад и пересмотреть подход к задаче, а возможно даже все переделать. Я это к тому, что очень плохо для саморазвития грешить на инструмент (мол он чего-то там не может), и очень хорошо грешить на себя (инструмент неправильно применен). Если признаться самому себе, что на каком-то этапе совершил ошибку, то способ нахождения истинного пути - дело техники. Так быстрее будет расти мастерство.
1
newbie666
Заблокирован
10.04.2014, 11:35  [ТС] #24
Цитата Сообщение от DrOffset Посмотреть сообщение
Я это к тому, что очень плохо для саморазвития грешить на инструмент (мол он чего-то там не может), и очень хорошо грешить на себя (инструмент неправильно применен)
это всё понятно, но инструмент С++ постоянно совершенствуется с каждым стандартом, причём не без участия программистов, которые пишут свои пожелания парням по стандартизации С++... По этому я б тоже написал им про фишки, которые хочу добавить в язык )))
Цитата Сообщение от DrOffset Посмотреть сообщение
Это все потому, что в этой формулировке задачи нет.
Ну почему же нет, смотри, есть... сто раз уже говорил, хочу присоединить класс к уже существующей цепи наследования... Ладно, внатуре забей Я тут подумал, что ведь в дочернем классе присутствует всё барахло их всех родительских , если делать кучу подобных присоединений, получишь крутой оверхэд по памяти ... Бред в общем. Наследование - это вообще по сути такая немного бесполезная штука, которая нужна по сути только в проектах, над которыми работают сотни кодеров, чтоб типа один хрен написал класс с каким то функционалом, а другой прогер унаследовался от этого класса и получил профит в уже существующем готовом функционале предыдущего прогера, типа разделение обязанностей ... Хотя вот в C# есть полезная штука - parial классы... ну да ладно ....
0
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
10.04.2014, 12:44 #25
Цитата Сообщение от newbie666 Посмотреть сообщение
По этому я б тоже написал им про фишки, которые хочу добавить в язык
На одном изместном российском форуме программистов не так давно был один товарищ из комитета (Николай Ивченков). И вот он говорил, что большая часть предложений - это ерунда. Потому что авторам не хватает знаний или выдержки составить непротиворечивое требование. Чтобы оно со всех сторон не ломало существующую систему и логику. Да и само было логичным. Учитывай это. Для того, чтобы это сделать - нужно досконально знать стандарт языка. А когда ты будешь его знать настолько, то половина твоих предложений уйдет сама собой.
Я очень много видел в инете подобных тем, где кто-то пытался обвинить язык в недостаточной полноте и отсуствии фич, однако недостаточно просто сказать "хочу вот это!". Нужно же это обосновать. Рассмотреть в комплексе с остальными возможностями языка. Как правило, заявления таких товарищей не выдерживали критики, просто хотя бы потому, что предложивший не до конца разобрался в языке.
Именно поэтому стандарты принимают так долго. Это длительный процесс проверки и обсуждений со всех сторон.

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

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

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

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

Добавлено через 59 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Как бы ты стал решать задачу?
да никак - самолёты слишком простая задача, которая пишется в рамках одного класса )))
0
10.04.2014, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2014, 20:57
Привет! Вот еще темы с ответами:

Использование переменных базового класса в дочернем классе - C++
Доброго времени суток. Подскажите пожалуйста как в классе SumbString работать с переменными(string s;int z ; ) класса factory ? Мне...

Не могу в дочернем классе вызвать protected метод - C++
Всем привет! Начал писать одну программку, и столкнулся со следующей проблемой: у меня пока 2 класса: MemObject и Vector, где Vector...

R6025 pure virtual function call при вызове метода, реализованного в дочернем классе - C++
Всем привет. Вот такая ошибка у меня возникает при вызове метода, который реализован в дочернем классе, но потом он почему-то становится...

Как в main() создать указатель на функцию, которая находится в классе? - C++
В этом примере как определить указатель на функцию F()? class A { public: bool F(int &a, int &b) { return a<b; } }; int...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru