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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 12:43     Вопросы по наследованию #1
Вопрос ещё по конструкторам

Допустим есть система классов
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 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
Просмотров: 43

Размер: 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
20.06.2013, 14:39     Вопросы по наследованию #22
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
так это же один в один идет с виртуальным наследованием. Они созданы друг для друга.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:40     Вопросы по наследованию #23
Цитата Сообщение от ValeryS Посмотреть сообщение
если я напишу так

C++
1
B* b=new B;

то выделится памяти под один объект размером B
Но часть этого размера будет размер А?
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
20.06.2013, 14:42     Вопросы по наследованию #25
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)

Добавлено через 57 секунд
pizurok, зачем отрезать то, с помощью чего реализуется "нечто" производное?
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 14:43  [ТС]     Вопросы по наследованию #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вот здесь кстати описывается что объекты содержат подобъекты, все таки объекты базовых существуют! Наконец-то ситуация проясняется. А демагоги так ничего мне и не смогли объяснить
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
20.06.2013, 14:45     Вопросы по наследованию #27
Цитата Сообщение от pizurok Посмотреть сообщение
А демагоги так ничего мне и не смогли объяснить
и конечно проблема в демагогах
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:48     Вопросы по наследованию #28
Цитата Сообщение от pizurok Посмотреть сообщение
содержат подобъекты, все таки объекты базовых существуют!
Как неотдельная часть объекта производного класса.
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 14:48  [ТС]     Вопросы по наследованию #29
Цитата Сообщение от MrGluck Посмотреть сообщение
pizurok, чтобы не было недопониманий, просто выражайте четче свои мысли. Если хотите узнать как все в памяти устроено - так и пишите. А не "создаются ли два объекта". Это, разумеется чушь. Есть классы, есть экземпляры классов. И один объект может быть экземпляром сразу многих классов. Я например и мужчина и брюнет и студент и классный парень Для каждого из этих классов не нужно создавать отдельного "меня". Я уникален)
В третий раз повторяю. Я знаю суть наследования и неоднократно программировал, объяснять теорию мне не надо. Я интересовался, каким образом устроены объекты на низком уровне, ведь фактически очевидно, что к данным базового класса мы можем обратиться даже если они и закрыты. Впрочем я уже выяснил, объект содержит подобъект, спасибо википедии, невнимательно читал
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:50     Вопросы по наследованию #30
И для этой части вызываются и конструктор и деструктор свои.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
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
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 14:50  [ТС]     Вопросы по наследованию #32
Цитата Сообщение от alsav22 Посмотреть сообщение
Как неотдельная часть объекта производного класса.
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
alsav22
5282 / 4801 / 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
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 14:53  [ТС]     Вопросы по наследованию #34
Цитата Сообщение от ValeryS Посмотреть сообщение
SatanaXIII,
есть куча решений самая простая из которых не допускать такой иерархии
Я думаю именно поэтому от множественного наследования отказались в жабе и в шарпе, ибо рвет моск и заставляет shit bricks.
По мне так множественное наследование - самое сложное в программировании, наряду с именами переменных методов и экземпляров
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.06.2013, 14:53     Вопросы по наследованию #35
Цитата Сообщение от pizurok Посмотреть сообщение
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах
Ответ на эту глупость, кстати, дан)))

Цитата Сообщение от ValeryS Посмотреть сообщение
есть куча решений, самое простое из которых - не допускать такой иерархии
Потому на практике - не особо приходится работать с ромбами) Проблема ромба - надуманная проблема множественного наследования, чтобы было об чом поговорить)))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:54     Вопросы по наследованию #36
Цитата Сообщение от pizurok Посмотреть сообщение
Это уже не совсем важно, фактически все таки экземпляр существует, пусть и часть другого экземпляра, но со своими уровнями доступа
Тут нужно определиться в терминах. Что есть экземпляр?
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
20.06.2013, 14:54  [ТС]     Вопросы по наследованию #37
Цитата Сообщение от MrGluck Посмотреть сообщение
и конечно проблема в демагогах
Вам важно найти виноватых или помочь разобраться в проблеме? Если первое, то у вас завышено ЧСВ, уж простите
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
20.06.2013, 14:55     Вопросы по наследованию #38
pizurok, я рекомендую вам к прочтению книгу "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов" Скотта Мейерса, он достаточно подробно описывает и ромбовидную проблему и реализацию объектов на, как вы говорите "нижнем уровне" и множественное наследование с применением модификаторов доступа public и private. Мне вот не понятно, объекты конечно являются частями других, но ведь они не могут существовать отдельно. Т.е. если А базовый класс, B производный, то объект класса B содержит в себе объект А, но не в отдельности, а как часть себя.
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,691
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++
Вопрос по наследованию C++
C++ Написать простейшую программу по "перегрузке" и "наследованию"

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
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     Вопросы по наследованию
Ответ Создать тему
Опции темы

Текущее время: 03:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru