![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Хм, не видит char(). Выводит int. Уточнение: полученный объект == копия данных класса? (Раньше объект воспринимал монолитно: объект - это и данные, и методы(когда не знал, что методы существуют в одном экземпляре))
Это? Это сообщение отредактировал(а) Gunslinger - 15.1.2010, 17:29 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не чар не видит.. когда нет абсолютно подходящей функции, тогда происходит неявное преобразование параметров. но это как правильно заметил baldina будет лишним.. оставим разбор на будущее.. зависит от способа передачи: если по значению то копия если по имени/ссылке то оригинал уточнение объект (инстанция класса) это совокупность всех не статических данных-членов как самого класса, так и всех его подклассов (и некой служебной информации в случае обладания виртуальными функциями) это про статические данные корректно говорить что они существуют в единственном экземпляре. а когда такое про функции - то слух режет. Дело в том смысле какой Вы вкладываете. Не важно в вашем вопросе сколько экземпляров метода существует. А в том что функции не принадлежат обьекту, а оперируют им.
мы вызвали НЕ функцию f объекта obj, а вызвали функцию f класса A и передали ей объект obj как параметр. ( то что получит функция зависит от способа передачи.. то есть прежде чем стать аргументом this может произойти как простое копирование (при передаче по значению), так и преобразование типа .. но это опять другая тема) Это сообщение отредактировал(а) mes - 15.1.2010, 20:00 |
|||
|
||||
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Это я понимаю. Просто хотел подчеркнуть, что:
Компилятор создает:
Это сообщение отредактировал(а) Gunslinger - 15.1.2010, 21:46 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у Вас либо куча опечаток в коде, либо Вы все таки не до конца поняли... |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну прежде всего в первом коде идет создание N объектов, а во 2м описание N структур объектов.
ну и мелочь : аналог метода описанный в namespace должен принимать (скрытый) параметр на объект. Вот расширенный пример того что Вы писали:
может быть представлен в таком условном коде : /* примечания : в квадратных скобках указываются скрытые параметры (при чтение кода не учитывать так как не являются разделительными) со знаком $ обозначены внутренние действия компилятора указание прав доступа не учитывается.. код не отнсящийся на прямую к примеру (std::cout) представлен без изменений */
надеюсь пример не запутает Вас eще сильней.. старался сделать как можно понятнее.. Это сообщение отредактировал(а) mes - 19.1.2010, 20:08 |
||||
|
|||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы ж не думаете, что принятая форма записи в С++ - единственная возможная ? часть B повторяет структуру А ? есть правило приведения от наследника к базовому ? Ну значит условно наследуется. ;) Я специально выбрал вариант, чтоб на разнице показать что есть наследование по сути. А вообще компилятор прежде, чем компилить в объектный файл, приводит текст программы в удобное для него состояние. Rаньше С++ компилятор был вообще простым С-кодогенератором. Т.е. из С++ программы генерил С-код (в котором как известно нет инструмента наследования). Ну так будем считать, что приведенный пример одна из стадий (препроцессор) такого кодогенератора, которая разворачивает код связанный с наследованием в условный с-структурный вид. Это сообщение отредактировал(а) mes - 18.1.2010, 11:28 |
|||
|
||||
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Кроме с++ной записи о других не знаю. Т.е. вы описали то же наследование? А то у меня чуть крыша не поехала
char [A::] c; -- это вроде ссылки или указателя на структуру А? Как происходит подобное приведение: определяется, где в структуре В находится А::с? |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Будет точнее сказать что я раскрыл классы с наследованием на простые структуры с той же зависимостью.
нет.. Зачем определяться если структура наследник, содержит все данные предка в той же последовательности с нулевым (в нашем случае) смещением. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
static_cast - это безопасное приведение. Для того чтоб наш наследник мог конвертиться мы установили хотя на самом деле лучше подошла бы функция-конвертер, но это опять уже несколько другая тема.. |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Благодаря скрытому параметру this каждый метод определяет, где находятся данные, с которыми он будет работать.. Тогда такое приведение значит, что this B меняется на this, где расположена struct A? Это сообщение отредактировал(а) Gunslinger - 19.1.2010, 12:50 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
убрал я из примера static_cast - для сути он не нужен. имя "A::f" логически идеентично "A_f", а "::" просто специфичный разделитель, позволяющий программисту записывать имена в неполной форме. (до полной дорабатывает компилятор) Хотя приведенное еще не полное имя функции, а специализированное.. - т.е. в имя включена зона в которой его определили. полное включает в себя еще типы параметров, благодаря чему и становится возможна перегрузка. |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Например, из кода
Компилятор делает нечто вроде A_char_c? Т.е. это то, как «выглядит» переменная на, практически, самом нижнем уровне? Еще одна вещь, над которой я раньше не задумывался.. Это сообщение отредактировал(а) Gunslinger - 20.2.2010, 15:01 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ага, в принципе так, только в более удобном для него виде. И с функциями тоже самое. Добавлено через 3 минуты и 4 секунды
1. не переменная, а ее имя. 2. на самом низшем имя заменяется на значения (например смещения), поэтому не на самом низшем, а после раскрытия всех скоупов (пространств имен) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |