Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810

Вопросы по наследованию

20.06.2013, 12:43. Показов 5177. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос ещё по конструкторам

Допустим есть система классов
C++
1
2
3
4
5
6
7
8
9
10
class A
{
    public:
         A() {}
};
class B: public A
{
    public:
         B() {}
};
Мы создаем экземпляр
C++
1
B b_obj;
Сколько будет фактически экземпляров? 1 B? или 2: A и B?
Или экземпляр A будет создан только если конструктор B вызывает конструктор A?
C++
1
B() : A() {}
И ещё вопрос. Предположим два экземпляра будет если конструктор B вызывает конструктор A
Пусть есть открытая переменная в A
C++
1
2
public:
    int a;
При обращении из экземпляра
C++
1
b_obj.a = 0;
Мы обратимся к a из экземпляра B или из экземпляра A?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2013, 12:43
Ответы с готовыми решениями:

По наследованию
Решил заняться паттернами проектирования и возник вопрос. Допустим есть абстрактный класс public abstract class First { ...

вопрос по наследованию
начал изучать ООП в РНР. нужно уточнение. имеется класс статей Aticle и дочерний класс NewsArticle, они отличаются тем что у второго...

Вопрос по наследованию
Вопрос насчёт передачи аргументов в конструктор базового класса(создания временного объекта), а именно почему у меня это не выходит и где у...

68
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 14:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
В чем заключается это проблема?
Прогблема ромба.
Ромбовидное наследование (англ. diamond inheritance) — ситуация в объектно-ориентированных языках программирования с поддержкой множественного наследования, когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. При этой схеме наследования может возникнуть неоднозначность: если метод класса D вызывает метод, определенный в классе A (и этот метод не был переопределен), а классы B и C по-своему переопределили этот метод, то от какого класса его наследовать: B или C?

Например, в области разработки графических интерфейсов класс Button («Кнопка») может одновременно наследовать от класса Rectangle («Прямоугольник», для внешнего вида) и от класса Clickable («Доступен для кликанья мышкой», для реализации функционала/обработки ввода), а Rectangle и Clickable наследуют от класса Object («Объект»). Если вызвать метод equals («Равно») для объекта Button, и в классе Button не окажется такого метода, но в классе Object будет присутствовать метод equals по-своему переопределенный как в классе Rectangle, так и в Clickable, то какой из методов должен быть вызван?

Проблема ромба (англ. diamond problem) получила свое название благодаря очертаниям диаграммы наследования классов в этой ситуации. В данной статье, класс A обозначается в виде вершины, классы B и C по отдельности указываются ниже, а D соединяется с обоими в самом низу, образуя ромб.
рис
Название: 180px-Diamond_inheritance.svg.png
Просмотров: 50

Размер: 5.0 Кб

C++ по умолчанию не создает ромбовидного наследования: компилятор обрабатывает каждый путь наследования отдельно, в результате чего объект D будет на самом деле содержать два разных подобъекта A, и при использовании членов A потребуется указать путь наследования (B::A или C::A). Чтобы сгенерировать ромбовидную структуру наследования, необходимо воспользоваться виртуальным наследованием класса A на нескольких путях наследования: если оба наследования от A к B и от A к C помечаются спецификатором virtual (например, class B : virtual public A), C++ специальным образом проследит за созданием только одного подобъекта A, и использование членов A будет работать корректно. Если виртуальное и невиртуальное наследования смешиваются, то получается один виртуальный подобъект A и по одному невиртуальному подобъекту A для каждого пути невиртуального наследования к A. При виртуальном вызове метода виртуального базового класса используется так называемое правило доминирования: компилятор запрещает виртуальный вызов метода, который был перегружен на нескольких путях наследования.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 14:39
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
так это же один в один идет с виртуальным наследованием. Они созданы друг для друга.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:40
Цитата Сообщение от ValeryS Посмотреть сообщение
если я напишу так

C++
1
B* b=new B;

то выделится памяти под один объект размером B
Но часть этого размера будет размер А?
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:41  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
Один
С чего два то?
дизасемблируй программу и увидишь что один объект
Тогда пример такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
    private:
        int a;
    public:
        A() : a(3) {}
        void Out(a)
        {
              cout<<a;
        }
};
 
class B: private A
{
    public:
         B():A() {}
         void Out()
         {
              A::Out();
         } 
 
};
Обращаемся в Out из B:
C++
1
2
B b_obj;
b.Out();
Теперь вопрос. Если объект фактически один, откуда берется переменная a = 3, если она закрыта? Такое чувство, что существует экземпляр A, которых и хранит переменную a, метод Out которого вызывается из экземпляра B?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 14:42
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)

Добавлено через 57 секунд
pizurok, зачем отрезать то, с помощью чего реализуется "нечто" производное?
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:43  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вот здесь кстати описывается что объекты содержат подобъекты, все таки объекты базовых существуют! Наконец-то ситуация проясняется. А демагоги так ничего мне и не смогли объяснить
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 14:45
Цитата Сообщение от pizurok Посмотреть сообщение
А демагоги так ничего мне и не смогли объяснить
и конечно проблема в демагогах
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:48
Цитата Сообщение от pizurok Посмотреть сообщение
содержат подобъекты, все таки объекты базовых существуют!
Как неотдельная часть объекта производного класса.
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:48  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)
В третий раз повторяю. Я знаю суть наследования и неоднократно программировал, объяснять теорию мне не надо. Я интересовался, каким образом устроены объекты на низком уровне, ведь фактически очевидно, что к данным базового класса мы можем обратиться даже если они и закрыты. Впрочем я уже выяснил, объект содержит подобъект, спасибо википедии, невнимательно читал
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:50
И для этой части вызываются и конструктор и деструктор свои.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
20.06.2013, 14:50
SatanaXIII,
это я знаю
я спрашиваю в чем проблема
да там все не так однозначно без виртуалки создадутся два объекта A и обращаться к нему нужно указав конкретный путь
но объект то один
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
 int a;
 
}
class B :public A
{
int b;
}
class C :public A
{
int c;
}
 
class D :public B ,public C 
{
int d;
}
 
D d;
в памяти будет
a b a c d
но это один объект
и написав
d.a=5;
не знаешь какую a он поменяет

чаще проблемы не с членами а с методами

есть куча решений самая простая из которых не допускать такой иерархии
1
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:50  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Как неотдельная часть объекта производного класса.
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:51
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
#include <iostream>
using namespace std;
 
class A
{
    public:
         int a;
         A() {}
};
 
class B: public A
{
        int b;
    public:
         B() {}
};
 
int main()
{
    cout << sizeof(A) << " " << sizeof(B) << endl;
 
    system("pause");
    return 0;
}
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:53  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
SatanaXIII,
есть куча решений самая простая из которых не допускать такой иерархии
Я думаю именно поэтому от множественного наследования отказались в жабе и в шарпе, ибо рвет моск и заставляет shit bricks.
По мне так множественное наследование - самое сложное в программировании, наряду с именами переменных методов и экземпляров
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
20.06.2013, 14:53
Цитата Сообщение от pizurok Посмотреть сообщение
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах
Ответ на эту глупость, кстати, дан)))

Цитата Сообщение от ValeryS Посмотреть сообщение
есть куча решений, самое простое из которых - не допускать такой иерархии
Потому на практике - не особо приходится работать с ромбами) Проблема ромба - надуманная проблема множественного наследования, чтобы было об чом поговорить)))
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:54
Цитата Сообщение от pizurok Посмотреть сообщение
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
Тут нужно определиться в терминах. Что есть экземпляр?
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:54  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
и конечно проблема в демагогах
Вам важно найти виноватых или помочь разобраться в проблеме? Если первое, то у вас завышено ЧСВ, уж простите
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 14:55
pizurok, я рекомендую вам к прочтению книгу "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" Скотта Мейерса, он достаточно подробно описывает и ромбовидную проблему и реализацию объектов на, как вы говорите "нижнем уровне" и множественное наследование с применением модификаторов доступа public и private. Мне вот не понятно, объекты конечно являются частями других, но ведь они не могут существовать отдельно. Т.е. если А базовый класс, B производный, то объект класса B содержит в себе объект А, но не в отдельности, а как часть себя.
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:56  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, я рекомендую вам к прочтению книгу "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" Скотта Мейерса, он достаточно подробно описывает и ромбовидную проблему и реализацию объектов на, как вы говорите "нижнем уровне" и множественное наследование с применением модификаторов доступа public и private. Мне вот не понятно, объекты конечно являются частями других, но ведь они не могут существовать отдельно. Т.е. если А базовый класс, B производный, то объект класса B содержит в себе объект А, но не в отдельности, а как часть себя.
Не могут, но это не суть важно. Важно что они сохраняют уровни доступа к данным внутри себя
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
20.06.2013, 14:56
Цитата Сообщение от pizurok Посмотреть сообщение
Обращаемся в Out из B:

Цитата Сообщение от pizurok Посмотреть сообщение
Если объект фактически один, откуда берется переменная a = 3, если она закрыта?
кому закрыта?
Цитата Сообщение от pizurok Посмотреть сообщение
Такое чувство, что существует экземпляр A, которых и хранит переменную a, метод Out которого вызывается из экземпляра B?
экземпляр B содержит внутри себя "экземпляр A" но это не отдельная память и не отдельный объект
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2013, 14:56
Помогаю со студенческими работами здесь

Вопрос по наследованию
Уже неоднократно перечитывал главы про наследования и все равно до конца не разобрался. Вот например у нас есть класс Четырехугольник, и...

Вопрос по наследованию
Вывод Hello СHild Hello Base Что сделать чтобы Base не выводило при подобном вызове? using System; namespace...

Непонятка по наследованию
Объясните пожалуйста такой момент. Ниже приведу код программы результат ее работы два сообщения: &quot;Поле y=0 Поле y=228 &quot;. Не...

Работа в Eclipse по наследованию
Создать абстрактный класс Строение (в качестве свойств использовать координаты, количество окон и дверей). Создать массив объектов...

Задание по наследованию классов
Создать иерархию классов : линия - прямоугольник - пирамида. Все классы должны содержать методы для фиксации и получения значений всех...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru