Заблокирован

Продолжение цепочки наследования без дублей базовых классов

26.10.2014, 15:10. Показов 4317. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
public:
    A();
    int x;  
};
 
class B : public A
{
public:
    B();
};
 
class C : public B
{
public:
    C();
};
Вот допустим делаю так:
C++
1
2
B* bObj = new B;
b->x = 777;
при этом создаются в памяти объект базового класса A и объект дочернего класса B, верное? Верно.
Теперь вопрос!
Хочу создать объект класса С
C++
1
C* cObj = new C;
чтоб этот объект имел один в один базовые классы, такие же как в предыдущей цепочке, то есть чтоб базовым классом объект cObj был именно объект bObj, то есть проинициализированный ранее уже объект класса B, ну соответственно чтоб А то же был такой же.

Грубо говоря, есть объект bObj (в памяти объект класса B и объект класса A), теперь хочу без создания лишних классов в памяти присоединить объект к этой цепочке наследования, то есть хочу её просто продолжить и добавить объект С, который будет являться наследником уже проинициализированного объекта B, чтоб в памяти было только А, B и C. Как такое можно сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2014, 15:10
Ответы с готовыми решениями:

Структура наследования базовых/производных классов: error LNK 1104
Может быть проблема, если я неправильно что-то записал в структуре наследования базовых/производных классов?

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...

Ошибка в инициализации базовых классов
Привет. Пишу код из книги Лафоре. #include <iostream> using namespace std; #include <windows.h> enum posneg {pos, meg}; class...

23
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
26.10.2014, 18:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Вот смотрите, я же могу из класса B получить класс С дайнкастингом, который будет является продолжением цепочки, то есть привести класс B к классу С даунгрейдом )) ? Как это правильно сделать, чтоб при этом память правильно алоцировалась под класс С ?
Если нечто, на что указывает B *, на самом деле не содержит в себе класс С, то просто так скастить B * -> C * нельзя. Проверить, возможен ли такой каст, можно через dynamic_cast.
Как мне кажется, в твоей задаче достаточно хранить списки "наследников", вместо наследования типов С++. В С++ наследование не предполагает динамического разделения базы между разными объектами наследников, поэтому напрямую механизм наследования для этого использовать не получится. Тут на форуме где-то уже была такая тема и я там подробно высказывался - поищи.
1
Заблокирован
26.10.2014, 18:43  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если нечто, на что указывает B *, на самом деле не содержит в себе класс С, то просто так скастить B * -> C * нельзя.
А нет ли какой - то конструкции, чтоб если С не содержится в В, чтоб память алоцировалась бы под класс С и он автоматов добавился бы в В и получилось, что он там как бы есть ?
Цитата Сообщение от DrOffset Посмотреть сообщение
Как мне кажется, в твоей задаче достаточно хранить списки "наследников", вместо наследования типов С++
тогда запись будет: наследник->то что мне нужно, или наследник наследника->наследник->то что мне нужно - ерунда в общем.
Цитата Сообщение от DrOffset Посмотреть сообщение
В С++ наследование не предполагает динамического разделения базы между разными объектами наследников, поэтому напрямую механизм наследования для этого использовать не получится.
Вот это уже осиновый кол в мой замысел
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут на форуме где-то уже была такая тема и я там подробно высказывался - поищи.
А там решение было найдено? Как я найду эту тему?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
26.10.2014, 19:57
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Как я найду эту тему?
Я нашел. И кажется этот вопрос поднимал ты. Но тебе тогда мое решение не понравилось, может быть ты сейчас на него другими глазами посмотришь?
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А нет ли какой - то конструкции, чтоб если С не содержится в В, чтоб память алоцировалась бы под класс С и он автоматов добавился бы в В и получилось, что он там как бы есть ?

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
тогда запись будет: наследник->то что мне нужно, или наследник наследника->наследник->то что мне нужно - ерунда в общем.
Синтаксического сахарку можно всегда добавить. Здесь нужно понять одну простую вещь: наследование в С++ применяется к типам, т.е. это отношение типов, статическое отношение. А ты хочешь отношение объектов, ты хочешь, чтобы один базовый объект был общим для нескольких других объектов. Это динамическое отношение, отношение объектов. В С++ такое реализуется через указатели на нужные объекты. Базовый может содержать список указателей своих дочерних, а дочерние, список своих дочерних и т.д. В то же время, каждый объект может содержать указатель на базовый объект. Получается дерево - иерархия.
1
Заблокирован
26.10.2014, 21:33  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
И кажется этот вопрос поднимал ты

Да тут можно организовать гиперграф объектов, но ведь тут вся фишка в том, что:
Цитата Сообщение от newbie666 Посмотреть сообщение
- видишь, много стрелочек -> Тоесть неудобно, я хотел работать вообще без стрелочек, еслиб данные были как бы унаследованны в в класс....

думаю надо ваще пересматривать архитектуру, т.к. в С++ нельзя подменять таблицы виртуальных символов вручную, что не может не огорчать.
Так что
Цитата Сообщение от newbie666 Посмотреть сообщение
ладно- надоело спасибо.. я спать ))))


Добавлено через 1 час 14 минут
В общем я примерно понял в какую сторону двигаться. Для конструирования подобных объектов используется идиома виртуальных конструкторов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2014, 21:33

Наследование функций базовых классов
Здравствуйте! Изучаю С++ по книге Р. Лафоре ООП С++ Примеры из главы 9 "Наследование" ставят меня в тупик: // counten.cpp ...

Использование базовых и производных классов
Не могу решить задачу с классами помогите с решением. Создать класс String – строка. Определить функции присваивания одной строки...

Класс наследуемый от двух базовых классов
Друзья Являеться ли класс (А)- Классом наследуемым от двух базовых классов? Если не правильно то как нужно написать ?.Помогите врозумить...

Множественное наследование с использованием абстрактных базовых классов
тема: Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций...

Нюансы использования абстрактных базовых классов (класс Shape)
У меня класс Point наследуется с абстрактного базового класса Shape, и Point тоже абстрактный, поскольку не определил функцию get_area()....


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

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

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru