![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| rukudias |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 28.2.2007 Репутация: 0 Всего: 0 |
Привет Всем!
Есть класс в нем одно поле char и один метод почему размер класса 1 байт? как тогда мы одращ к методу! Есть класс в нем одно поле char и один метод virtual почему размер класса 1+4 байт? это указ на таб виртуал функций? Спасибо |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
оффтоп
rukudias, ты, случаем, на брэйнфаке не пишешь? ;) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Очень просто. На этапе компиляции компилятор определяет какой метод должен быть вызван и подставляет его вызов. При этом методу неявно передается указатель на экземляр класса (для нестатических методов). |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Потому что методы не содержатся внутри класса, а хранятся отдельно. Причём хранится ОДИН экземпляр метода для всех экземпляров класса.
В сущности, метод класса ничем не отличается от обычной глобальной функции, кроме того, что он получает ещё указатель на объект класса и кладёт его в переменную this. То есть, например, вот такой код
полностью эквивалентен коду
Чтобы работать с первым методом, нужно записать имя переменной типа A, потом поставить точечку и затем записать в скобках остальные аргументы. А чтобы работать со вторым методом, нужно адрес переменной типа A передать в первом аргументе. Какая разница, где указывается аргумент: перед точечкой или после скобочки? В структуре от этого всё равно ничего не прибавляется. А вот виртуальная функция добавляет в структуру поле со своим адресом. Тело функции всё равно присутствует в памяти в единственном экземпляре, но зато появляется возможность косвенной адресации. То есть, если в наследнике будет переопределена эта виртуальная функция, то в поле адреса попадёт адрес другой функции. И код, написанный для базового класса, не заметив этого, вызовет не функцию базового класса, а функцию наследника. Добавлено через 53 секунды Тьфу, забыл точку с запятой после тела класса. Её ещё не отменили, кстати? |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
skyboy, насколько я знаю, в объекте хранятся указатели на все таблицы для всех базовых классов. Например
Размер AB2 будет 8 байт: один указатель на таблицу виртуальных методов класса А1, другой - класса B1. Это сообщение отредактировал(а) Ln78 - 9.11.2007, 09:16 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Да нет же, таблица VMT у наследника объединяется таблицей VMT предка. У объекта только одна VMT. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Alexeis, по крайней мере, в VS это именно так: два указателя.
skyboy, я всех причин не знаю. Наверное, в том числе и для того, чтобы если класс наследует от двух других, имеющих одинаковую по сигнатуре функцию, у него была возможность выбрать любую из них. P.S. Кстати, Alexeis, ты говоришь об объединении предка и потомка, а я - про разных предков. Это сообщение отредактировал(а) Ln78 - 9.11.2007, 10:34 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
||||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
не совсем VMT одна, но объект содержит столько указателей (указывающих на данные внутри таблицы), сколько у его класса предков
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Ln78, а ну да, для множественного наследования нужно.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| rukudias |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 201 Регистрация: 28.2.2007 Репутация: 0 Всего: 0 |
ВСЕМ респект и уважуха!
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |