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

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

20.06.2013, 12:43. Показов 4915. Ответов 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,859
20.06.2013, 12:54
Цитата Сообщение от 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 не знает такого члена)
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 13:01  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
и если
обратится к объекту как к C то можешь достучатся до всех трех членов
а если как к A то до члена c не достучишься (класс A не знает такого члена)
Это я знаю, не первый день программирую на плюсах, я спрашивал другое.

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

Добавлено через 4 минуты
Цитата Сообщение от pizurok Посмотреть сообщение
Мы обратимся к a из экземпляра B или из экземпляра A?
Из B.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 13:26

Или я чего-то не понял?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 13:32
Или даже вот так:
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
20.06.2013, 13:33
SatanaXIII, конструкторы вызываются начиная с корня иерархии.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 13:34
Цитата Сообщение от 0x10 Посмотреть сообщение
конструкторы вызываются начиная с корня иерархии.
Я как раз и об этом.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 13:53
В первом коде, если exB ->a и exB ->b закоментировть?

Добавлено через 1 минуту
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я как раз и об этом.
А кто сказал другое?
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 13:58  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Конструктор не создаёт объкты, а инициализирует. В объекте производного класса всегда присутствует объект базового класса. Сначала должен быть инициализирован объект базового класса, поэтому конструктор базового класса всегда вызвывается (явно, через список инициализаторов, или не явно ) перед вызовом конструктора производного класса.
Спасибо, вот этого ответа я ждал
Цитата Сообщение от alsav22 Посмотреть сообщение
Из B.
Тогда как обратится к переменной a из экземпляра A?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:14
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда как обратится к переменной a из экземпляра A?
Так же. Создайте экземпляр А и обращайтесь (к полю этого объекта).

Добавлено через 7 минут
Если же имеется ввиду экземпляр А, который является частью В, то он не является отдельным объектом.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.06.2013, 14:15
Цитата Сообщение от alsav22 Посмотреть сообщение
В первом коде, если exB ->a и exB ->b закоментировть?
Аг-га.
Цитата Сообщение от alsav22 Посмотреть сообщение
А кто сказал другое?
Занимаюсь иллюстрациями.
Цитата Сообщение от alsav22 Посмотреть сообщение
Так же. Создайте экземпляр А и обращайтесь (к полю этого объекта).
А вот тут как раз раскомментировать.
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:21  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же имеется ввиду экземпляр А, который является частью В, то он не является отдельным объектом.
Вот тут у меня и настает уровень непонимания. Экземпляр B создает экземпляр A, но тот не является отдельным объектом, а чем он тогда является? Два объекта объединяются каким-то магическим образом в один?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 14:24
Вот вы являетесь мужчиной из Беларусии, что является подмножеством всех мужчин. То, что вы принадлежите к первому нисколько не противоречит, и даже влечет то, что вы относитесь и ко второму.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:25
Цитата Сообщение от pizurok Посмотреть сообщение
Экземпляр B создает экземпляр A
Нет. Содаётся один объект В. Если В наследник А, то в таком объекте, как часть, будет и А.
Цитата Сообщение от pizurok Посмотреть сообщение
а чем он тогда является?
Частью В.

Цитата Сообщение от pizurok Посмотреть сообщение
Два объекта объединяются каким-то магическим образом в один?
Да. Магия называется: наследование.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,859
20.06.2013, 14:27
Цитата Сообщение от pizurok Посмотреть сообщение
Это я знаю, не первый день программирую на плюсах, я спрашивал другое.
что то непохоже
нет объекта A и объекта B
есть один объект к которому можно обратится через базовый класс а можно через производный

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

но объект то один а не два Вася-Мужчина и Вася-Человек
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:28  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Вот вы являетесь мужчиной из Беларусии, что является подмножеством всех мужчин. То, что вы принадлежите к первому нисколько не противоречит, и даже влечет то, что вы относитесь и ко второму.
Я прекрасно понимаю суть наследования, более того, я написал не один десяток программ по наследованию и полиморфизму. Однако когда я столкнулся с проблемой ромба я понял, что не до конца понимаю как реально расположены объекты. Я хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально, как копируются поля и, если объекта фактически два, дублируются ли открытые и защищенные данные в оба объекта?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.06.2013, 14:31
Если про то, как это всё выглядит в памяти, то, наверное, от реализации зависит (как предположение).
0
 Аватар для pizurok
77 / 69 / 20
Регистрация: 05.05.2013
Сообщений: 3,810
20.06.2013, 14:33  [ТС]
Я вижу вы все тут все прекрасно понимаете.
Тогда скажите мне, как решать проблему ромба?
Если кто-либо с ней не сталкивался, то я сомневаюсь что он много писал на плюсах и фактически является демагогом.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,859
20.06.2013, 14:34
Цитата Сообщение от pizurok Посмотреть сообщение
хочу разобраться в наследовании на более низком уровне, сколько экземпляров реально,
Один

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

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

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

Добавлено через 46 секунд
Цитата Сообщение от pizurok Посмотреть сообщение
Тогда скажите мне, как решать проблему ромба?
В чем заключается это проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2013, 14:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru