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

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

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

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

20.06.2013, 12:43. Просмотров 1635. Ответов 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++
Написать программу с объектами и реализовать наследование. Ситуация: Klimat (базовый объект), Derevo (выводной объект). a. Klimat:...

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

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

Вопросы по C++ - C++
Хочу учиться писать программы на C++, и у меня несколько вопросов 1) Этот язык такой же сложный, как Ассемблер? Например, Паскаль мне...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5594 / 2628 / 240
Регистрация: 01.11.2011
Сообщений: 6,469
Завершенные тесты: 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Эксперт С++
7002 / 4173 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
20.06.2013, 14:39     Вопросы по наследованию #22
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
так это же один в один идет с виртуальным наследованием. Они созданы друг для друга.
alsav22
5416 / 4812 / 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,182
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Эксперт С++
7002 / 4173 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
20.06.2013, 14:42     Вопросы по наследованию #25
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)

Добавлено через 57 секунд
pizurok, зачем отрезать то, с помощью чего реализуется "нечто" производное?
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:43  [ТС]     Вопросы по наследованию #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вот здесь кстати описывается что объекты содержат подобъекты, все таки объекты базовых существуют! Наконец-то ситуация проясняется. А демагоги так ничего мне и не смогли объяснить
MrGluck
Модератор
Эксперт CЭксперт С++
7002 / 4173 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
20.06.2013, 14:45     Вопросы по наследованию #27
Цитата Сообщение от pizurok Посмотреть сообщение
А демагоги так ничего мне и не смогли объяснить
и конечно проблема в демагогах
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:48     Вопросы по наследованию #28
Цитата Сообщение от pizurok Посмотреть сообщение
содержат подобъекты, все таки объекты базовых существуют!
Как неотдельная часть объекта производного класса.
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:48  [ТС]     Вопросы по наследованию #29
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)
В третий раз повторяю. Я знаю суть наследования и неоднократно программировал, объяснять теорию мне не надо. Я интересовался, каким образом устроены объекты на низком уровне, ведь фактически очевидно, что к данным базового класса мы можем обратиться даже если они и закрыты. Впрочем я уже выяснил, объект содержит подобъект, спасибо википедии, невнимательно читал
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:50     Вопросы по наследованию #30
И для этой части вызываются и конструктор и деструктор свои.
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
20.06.2013, 14:50     Вопросы по наследованию #31
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 он поменяет

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

есть куча решений самая простая из которых не допускать такой иерархии
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:50  [ТС]     Вопросы по наследованию #32
Цитата Сообщение от alsav22 Посмотреть сообщение
Как неотдельная часть объекта производного класса.
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:51     Вопросы по наследованию #33
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;
}
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:53  [ТС]     Вопросы по наследованию #34
Цитата Сообщение от ValeryS Посмотреть сообщение
SatanaXIII,
есть куча решений самая простая из которых не допускать такой иерархии
Я думаю именно поэтому от множественного наследования отказались в жабе и в шарпе, ибо рвет моск и заставляет shit bricks.
По мне так множественное наследование - самое сложное в программировании, наряду с именами переменных методов и экземпляров
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.06.2013, 14:53     Вопросы по наследованию #35
Цитата Сообщение от pizurok Посмотреть сообщение
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах
Ответ на эту глупость, кстати, дан)))

Цитата Сообщение от ValeryS Посмотреть сообщение
есть куча решений, самое простое из которых - не допускать такой иерархии
Потому на практике - не особо приходится работать с ромбами) Проблема ромба - надуманная проблема множественного наследования, чтобы было об чом поговорить)))
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:54     Вопросы по наследованию #36
Цитата Сообщение от pizurok Посмотреть сообщение
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
Тут нужно определиться в терминах. Что есть экземпляр?
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:54  [ТС]     Вопросы по наследованию #37
Цитата Сообщение от MrGluck Посмотреть сообщение
и конечно проблема в демагогах
Вам важно найти виноватых или помочь разобраться в проблеме? Если первое, то у вас завышено ЧСВ, уж простите
MrGluck
Модератор
Эксперт CЭксперт С++
7002 / 4173 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
20.06.2013, 14:55     Вопросы по наследованию #38
pizurok, я рекомендую вам к прочтению книгу "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" Скотта Мейерса, он достаточно подробно описывает и ромбовидную проблему и реализацию объектов на, как вы говорите "нижнем уровне" и множественное наследование с применением модификаторов доступа public и private. Мне вот не понятно, объекты конечно являются частями других, но ведь они не могут существовать отдельно. Т.е. если А базовый класс, B производный, то объект класса B содержит в себе объект А, но не в отдельности, а как часть себя.
pizurok
76 / 68 / 3
Регистрация: 05.05.2013
Сообщений: 3,182
20.06.2013, 14:56  [ТС]     Вопросы по наследованию #39
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, я рекомендую вам к прочтению книгу "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" Скотта Мейерса, он достаточно подробно описывает и ромбовидную проблему и реализацию объектов на, как вы говорите "нижнем уровне" и множественное наследование с применением модификаторов доступа public и private. Мне вот не понятно, объекты конечно являются частями других, но ведь они не могут существовать отдельно. Т.е. если А базовый класс, B производный, то объект класса B содержит в себе объект А, но не в отдельности, а как часть себя.
Не могут, но это не суть важно. Важно что они сохраняют уровни доступа к данным внутри себя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 14:56     Вопросы по наследованию
Еще ссылки по теме:

Вопросы - C++
Здравствуйте! 1. Как сделать так, чтобы программа (функция (strlen() ) не считала пробелы? 2. Можно ли упростить (сократить)...

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

Вопросы по C++ - C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...

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

Ответить на вопросы - C++
1. Какое условие является обязательным для присвоения одного объекта другому? 2. Когда объект передается функции в качестве аргумента,...


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
20.06.2013, 14:56     Вопросы по наследованию #40
Цитата Сообщение от pizurok Посмотреть сообщение
Обращаемся в Out из B:

Цитата Сообщение от pizurok Посмотреть сообщение
Если объект фактически один, откуда берется переменная a = 3, если она закрыта?
кому закрыта?
Цитата Сообщение от pizurok Посмотреть сообщение
Такое чувство, что существует экземпляр A, которых и хранит переменную a, метод Out которого вызывается из экземпляра B?
экземпляр B содержит внутри себя "экземпляр A" но это не отдельная память и не отдельный объект
Yandex
Объявления
20.06.2013, 14:56     Вопросы по наследованию
Ответ Создать тему
Опции темы

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