Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 51

Создается ли копия методов при создании экземпляра дочернего класса

29.12.2022, 19:18. Показов 1758. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня такой вопрос, вот допустим есть базовый класс BaseClass, в котором есть метод Attack(). И есть 2 класса-наследника, класс Archer и класс Mag. При создании экземпляров классов-наследников, метод Attack() в памяти создается для каждого экземпляра класса? Или он имеет один адрес и при создании двух экземпляров разных классов, при его вызове, код будет обращаться по одному и тому же адресу?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class BaseClass
{
public:
void Attack() { ... }
};
 
class Archer : public BaseClass
{
};
 
class Mag : public BaseClass
{
};
 
 
int main()
{
Archer arch;
Mag mag;
arch.Attack();
mag.Attack();
return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2022, 19:18
Ответы с готовыми решениями:

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Как при создании экземпляра класса инициализировать переменные вложенного класса
Здравствуйте. Подскажите пожалуйста как при создании екземпляра класа инициализировать переменные вложеного класа. Добавлено через 22...

22
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
30.12.2022, 13:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от bReeeZeL Посмотреть сообщение
то адрес переменной char code[] будет начинаться с одного и того же места.
Нет.
На то она и локальная переменная "на стеке".
Физически код функции в памяти один, но для каждого потока выделяется отдельный стек (чтобы была возможность выполнять код параллельно). Соответственно все локальные переменные, адреса возврата и т.д. - оно для каждого потока в отдельном стеке лежит, не пересекается.
А сам выполнимый код - един раз в памяти.
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
30.12.2022, 15:13
Цитата Сообщение от bReeeZeL Посмотреть сообщение
Но в процессе выполнения метода в стек поместится указатель на начало этих данных code[0],
и код никак не плодится
в стек ничего из кода не помещается,
хватит уже додумывать как оно что работает!
ну, вот пример есть
C++
1
char code[11] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
из этого к примеру получается код,
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
возьми адрес вершины стека
увеличь на 1
положи в него 01
увеличь на 1
положи в него 02
увеличь на 1
положи в него 03
увеличь на 1
положи в него 04
увеличь на 1
положи в него 05
увеличь на 1
положи в него 06
увеличь на 1
положи в него 07
увеличь на 1
положи в него 08
увеличь на 1
положи в него 09
увеличь на 1
положи в него 0А
Этот набор инструкций в памяти лежит действительно один, в одном экземпляре.
Но когда выполняется в двух потоках, "адрес вершины стека" у каждого будет свой,
просто одна программа выполнится 2 раза для разных исходных данных.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,337
30.12.2022, 20:58
Цитата Сообщение от bReeeZeL Посмотреть сообщение

C++
1
char code[11] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
Но в процессе выполнения метода в стек поместится указатель на начало этих данных code[0], на самый первый байт. В другом потоке, несмотря на то, что стеки разные, в стек будет тоже помещен указатель на массив, но одинаковый ли он будет. Или он выделит еще место под такой массив для второго потока?
Вы о чем? Какой "указатель"? Где?

Если бы у вас в программе действительно был объявлен указатель

C++
1
const char *code = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A";
то тогда был бы указатель. Но в этом случае указуемые данные все равно были бы константными и модифицировать эти данные вы все равно не смогли бы - строковые литералы в С и С++ не являются модифицируемыми.

Но у вас в программе нет никакого указателя. У вас объявлен локальный массив. Он самостоятелен, независим, уникален и локален для каждого вызова. Никто, кроме единственного вызова, не имеет к этому массиву доступа. Никто. То есть и защищать от конкурентного доступа этот массив никакого смысла нет, ибо никакого конкурентного доступа нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2022, 20:58

Что происходит с методами класса при создании экземпляра класса ? Память для каждого метода также отводится ?
Вопрос чайника: Что происходит с методами класса при создании экземпляра класса ? Память для каждого метода также отводится ? Если в...

Ошибка при создании экземпляра класса
Почему выдает такую ошибку?(С base уже пробовал, не работает) Код программы: Form1.cs: using System; using...

Ошибка при создании экземпляра класса
На скринах показано, где ошибка Вот код: #include <iostream> #include <string> #include <iomanip> #include...

Размер массива при создании экземпляра класса
Нет возможности использовать динамически выделяемую память под массив. Используется в микроконтроллерах, память в обрез и компилятор глючит...

Переполнение стека при создании экземпляра класса
Здравствуйте. Изучаю C#, решил попробовать создать дерево классов. Базовый абстрактный класс - мебель(имеет материал и вес), от него два...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru