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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
20.06.2013, 12:54     Вопросы по наследованию #2
Цитата Сообщение от pizurok Посмотреть сообщение
Сколько будет фактически экземпляров? 1 B? или 2: A и B?
один B
но к нему можно обратится как к A
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
int a;
int b;
}
 
class C: public A
{
public:
int c;
}
 
C obj;
в памяти будет лежать
a b c
причем a b достались от класса A

и если
обратится к объекту как к C то можешь достучатся до всех трех членов
а если как к A то до члена c не достучишься (класс A не знает такого члена)
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
20.06.2013, 13:01  [ТС]     Вопросы по наследованию #3
Цитата Сообщение от ValeryS Посмотреть сообщение
и если
обратится к объекту как к C то можешь достучатся до всех трех членов
а если как к A то до члена c не достучишься (класс A не знает такого члена)
Это я знаю, не первый день программирую на плюсах, я спрашивал другое.

При обращении из экземпляра
C++
1
b_obj.a = 0;
Мы обратимся к a из экземпляра B или из экземпляра A?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 13:16     Вопросы по наследованию #4
Цитата Сообщение от pizurok Посмотреть сообщение
Или экземпляр A будет создан только если конструктор B вызывает конструктор A?
Конструктор не создаёт объкты, а инициализирует. В объекте производного класса всегда присутствует объект базового класса. Сначала должен быть инициализирован объект базового класса, поэтому конструктор базового класса всегда вызвывается (явно, через список инициализаторов, или не явно ) перед вызовом конструктора производного класса.

Добавлено через 4 минуты
Цитата Сообщение от pizurok Посмотреть сообщение
Мы обратимся к a из экземпляра B или из экземпляра A?
Из B.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
20.06.2013, 13:26     Вопросы по наследованию #5
Вопросы по наследованию
Или я чего-то не понял?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
20.06.2013, 13:32     Вопросы по наследованию #6
Или даже вот так:
Вопросы по наследованию
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.06.2013, 13:33     Вопросы по наследованию #7
SatanaXIII, конструкторы вызываются начиная с корня иерархии.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
20.06.2013, 13:34     Вопросы по наследованию #8
Цитата Сообщение от 0x10 Посмотреть сообщение
конструкторы вызываются начиная с корня иерархии.
Я как раз и об этом.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 13:53     Вопросы по наследованию #9
В первом коде, если exB ->a и exB ->b закоментировть?

Добавлено через 1 минуту
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я как раз и об этом.
А кто сказал другое?
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
20.06.2013, 13:58  [ТС]     Вопросы по наследованию #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Конструктор не создаёт объкты, а инициализирует. В объекте производного класса всегда присутствует объект базового класса. Сначала должен быть инициализирован объект базового класса, поэтому конструктор базового класса всегда вызвывается (явно, через список инициализаторов, или не явно ) перед вызовом конструктора производного класса.
Спасибо, вот этого ответа я ждал
Цитата Сообщение от alsav22 Посмотреть сообщение
Из B.
Тогда как обратится к переменной a из экземпляра A?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:14     Вопросы по наследованию #11
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда как обратится к переменной a из экземпляра A?
Так же. Создайте экземпляр А и обращайтесь (к полю этого объекта).

Добавлено через 7 минут
Если же имеется ввиду экземпляр А, который является частью В, то он не является отдельным объектом.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
20.06.2013, 14:15     Вопросы по наследованию #12
Цитата Сообщение от alsav22 Посмотреть сообщение
В первом коде, если exB ->a и exB ->b закоментировть?
Аг-га.
Цитата Сообщение от alsav22 Посмотреть сообщение
А кто сказал другое?
Занимаюсь иллюстрациями.
Цитата Сообщение от alsav22 Посмотреть сообщение
Так же. Создайте экземпляр А и обращайтесь (к полю этого объекта).
А вот тут как раз раскомментировать.
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
20.06.2013, 14:21  [ТС]     Вопросы по наследованию #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же имеется ввиду экземпляр А, который является частью В, то он не является отдельным объектом.
Вот тут у меня и настает уровень непонимания. Экземпляр B создает экземпляр A, но тот не является отдельным объектом, а чем он тогда является? Два объекта объединяются каким-то магическим образом в один?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
20.06.2013, 14:24     Вопросы по наследованию #14
Вот вы являетесь мужчиной из Беларусии, что является подмножеством всех мужчин. То, что вы принадлежите к первому нисколько не противоречит, и даже влечет то, что вы относитесь и ко второму.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:25     Вопросы по наследованию #15
Цитата Сообщение от pizurok Посмотреть сообщение
Экземпляр B создает экземпляр A
Нет. Содаётся один объект В. Если В наследник А, то в таком объекте, как часть, будет и А.
Цитата Сообщение от pizurok Посмотреть сообщение
а чем он тогда является?
Частью В.

Цитата Сообщение от pizurok Посмотреть сообщение
Два объекта объединяются каким-то магическим образом в один?
Да. Магия называется: наследование.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
20.06.2013, 14:27     Вопросы по наследованию #16
Цитата Сообщение от pizurok Посмотреть сообщение
Это я знаю, не первый день программирую на плюсах, я спрашивал другое.
что то непохоже
нет объекта A и объекта B
есть один объект к которому можно обратится через базовый класс а можно через производный

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

но объект то один а не два Вася-Мужчина и Вася-Человек
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
20.06.2013, 14:28  [ТС]     Вопросы по наследованию #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Вот вы являетесь мужчиной из Беларусии, что является подмножеством всех мужчин. То, что вы принадлежите к первому нисколько не противоречит, и даже влечет то, что вы относитесь и ко второму.
Я прекрасно понимаю суть наследования, более того, я написал не один десяток программ по наследованию и полиморфизму. Однако когда я столкнулся с проблемой ромба я понял, что не до конца понимаю как реально расположены объекты. Я хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально, как копируются поля и, если объекта фактически два, дублируются ли открытые и защищенные данные в оба объекта?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:31     Вопросы по наследованию #18
Если про то, как это всё выглядит в памяти, то, наверное, от реализации зависит (как предположение).
pizurok
 Аватар для pizurok
53 / 67 / 3
Регистрация: 05.05.2013
Сообщений: 2,712
20.06.2013, 14:33  [ТС]     Вопросы по наследованию #19
Я вижу вы все тут все прекрасно понимаете.
Тогда скажите мне, как решать проблему ромба?
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах и фактически является демагогом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 14:34     Вопросы по наследованию
Еще ссылки по теме:

Задача по наследованию. Не понимаю некоторые моменты в формулировке задания C++
Вопрос по наследованию C++
C++ Написать простейшую программу по "перегрузке" и "наследованию"

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
20.06.2013, 14:34     Вопросы по наследованию #20
Цитата Сообщение от pizurok Посмотреть сообщение
хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально,
Один

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

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

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

Добавлено через 46 секунд
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
В чем заключается это проблема?
Yandex
Объявления
20.06.2013, 14:34     Вопросы по наследованию
Ответ Создать тему
Опции темы

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