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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
#1

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

20.06.2013, 12:43. Просмотров 1739. Ответов 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2013, 12:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопросы по наследованию (C++):

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

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

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

Задача по наследованию в C++, нужно реализовать некоторые моменты - C++
Написать программу с объектами и реализовать наследование. Ситуация: Klimat (базовый объект), Derevo (выводной объект). a. Klimat:...

Задача по наследованию. Не понимаю некоторые моменты в формулировке задания - C++
Здравствуйте! Вот есть задание: Описать базовый класс СТРОКА Обязательные поля класса: # Указатель на char - хранит адрес...

"Предпочитайте композицию наследованию" - C++
Привет. В книге "Стандарты программирования на С++" есть совет 34: "Предпочитайте композицию наследованию" Хочу уточнить на счет...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.06.2013, 14:27 #16
Цитата Сообщение от pizurok Посмотреть сообщение
Это я знаю, не первый день программирую на плюсах, я спрашивал другое.
что то непохоже
нет объекта A и объекта B
есть один объект к которому можно обратится через базовый класс а можно через производный

есть объект Вася
у которого есть свойства производного класса (Мужчина) и свойства базового(Человек)

но объект то один а не два Вася-Мужчина и Вася-Человек
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
20.06.2013, 14:28  [ТС] #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Вот вы являетесь мужчиной из Беларусии, что является подмножеством всех мужчин. То, что вы принадлежите к первому нисколько не противоречит, и даже влечет то, что вы относитесь и ко второму.
Я прекрасно понимаю суть наследования, более того, я написал не один десяток программ по наследованию и полиморфизму. Однако когда я столкнулся с проблемой ромба я понял, что не до конца понимаю как реально расположены объекты. Я хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально, как копируются поля и, если объекта фактически два, дублируются ли открытые и защищенные данные в оба объекта?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:31 #18
Если про то, как это всё выглядит в памяти, то, наверное, от реализации зависит (как предположение).
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
20.06.2013, 14:33  [ТС] #19
Я вижу вы все тут все прекрасно понимаете.
Тогда скажите мне, как решать проблему ромба?
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах и фактически является демагогом.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.06.2013, 14:34 #20
Цитата Сообщение от pizurok Посмотреть сообщение
хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально,
Один

Цитата Сообщение от pizurok Посмотреть сообщение
если объекта фактически два,
С чего два то?
Цитата Сообщение от pizurok Посмотреть сообщение
Я хочу разобраться в наследовании на более низком уровне,
дизасемблируй программу и увидишь что один объект

если я напишу так

C++
1
B* b=new B;
то выделится памяти под один объект размером B
а не два размером A и размером B или там размером A и размером B-A

Добавлено через 46 секунд
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
В чем заключается это проблема?
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
20.06.2013, 14:38 #21
Цитата Сообщение от 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
Просмотров: 45

Размер: 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. При виртуальном вызове метода виртуального базового класса используется так называемое правило доминирования: компилятор запрещает виртуальный вызов метода, который был перегружен на нескольких путях наследования.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
20.06.2013, 14:39 #22
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
так это же один в один идет с виртуальным наследованием. Они созданы друг для друга.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:40 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
если я напишу так

C++
1
B* b=new B;

то выделится памяти под один объект размером B
Но часть этого размера будет размер А?
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
20.06.2013, 14:41  [ТС] #24
Цитата Сообщение от 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?
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
20.06.2013, 14:42 #25
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)

Добавлено через 57 секунд
pizurok, зачем отрезать то, с помощью чего реализуется "нечто" производное?
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
20.06.2013, 14:43  [ТС] #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вот здесь кстати описывается что объекты содержат подобъекты, все таки объекты базовых существуют! Наконец-то ситуация проясняется. А демагоги так ничего мне и не смогли объяснить
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
20.06.2013, 14:45 #27
Цитата Сообщение от pizurok Посмотреть сообщение
А демагоги так ничего мне и не смогли объяснить
и конечно проблема в демагогах
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:48 #28
Цитата Сообщение от pizurok Посмотреть сообщение
содержат подобъекты, все таки объекты базовых существуют!
Как неотдельная часть объекта производного класса.
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,293
20.06.2013, 14:48  [ТС] #29
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)
В третий раз повторяю. Я знаю суть наследования и неоднократно программировал, объяснять теорию мне не надо. Я интересовался, каким образом устроены объекты на низком уровне, ведь фактически очевидно, что к данным базового класса мы можем обратиться даже если они и закрыты. Впрочем я уже выяснил, объект содержит подобъект, спасибо википедии, невнимательно читал
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:50 #30
И для этой части вызываются и конструктор и деструктор свои.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 14:50
Привет! Вот еще темы с ответами:

Написать простейшую программу по "перегрузке" и "наследованию" - C++
написать простейшую программу на СИ++ по &quot;перегрузке&quot; и &quot;наследованию&quot;. заранее спасибо!

Вопросы по C++ - C++
Всем привет! У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них. 1) Как...

Вопросы - C++
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...

Вопросы!!! - C++
прошу посоветовать что почитать чтобы ответить на следующие вопросы!!(можно ответить ссылками) если будут промеры по теме буду рад:) ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2013, 14:50
Ответ Создать тему
Опции темы

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