![]() |
|
Модераторы: bsa |
![]()
|
|
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Правильно ли Я понимаю?
Допустим есть класс BasicClass (базовый класс) и ProdClass (производный от него класс):
Вопрос. Правильно ли Я понимаю, что когда мы в main пишем
то на печать выходит 15,20, т.к x и y относятяся к объекту PredClass Это сообщение отредактировал(а) yngwie19 - 4.11.2008, 11:23 |
||||
|
|||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Все так и будет.
Только x и y не относятся к объекту PredClass. Это сообщение отредактировал(а) Andrey44 - 4.11.2008, 11:27 -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Andrey44, Ну понятно что они не описаны в классе PredClass, но они наследуются от класса BasicClass, значит как-бы относятся. Или Я ошибаюсь
Добавлено через 3 минуты и 5 секунд Andrey44, А мы можем как-нибудь инициализировать x и y для объекта PrebClass, не используя конструктор BasicClass ? |
|||
|
||||
| Fazil6 |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
нет. Это не скомпилится. должно быть
и делать x и y protected не нужно. Лучше private Добавлено через 3 минуты и 17 секунд
если они protected, то это возможно при наличии у BasicClass конструктора поумолчанию
но строго говоря - это нарушение инкапсуляции |
||||||||
|
|||||||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
ну если ты не хочешь использовать конструктор BasicClass(int a, int b), то нужно же каким-то другим конструктором инициализировать базовый класс Добавлено через 3 минуты и 11 секунд а вообще, повторяю, то о чем ты спрашиваешь возможно, но так делать не стоит.
это наследование интерфейса
это наследование реализации |
||||
|
|||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Fazil6, т.е так Я сделать не смогу?
|
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
ну попробуй и увидишь. Оно ведь не скомпиллится.
но так как ты определил конструктор
то конструктор поумолчанию компиллятором не генерится и его нет Если ты дополнительно определишь конструктор BasicClass() , то работать это будет, только как грится через Ж..У. Переменные должны инициализироваться в том классе, в котором они определены. Почитай про порядок создания объектов и инициализацию их членов. |
||||
|
|||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Нет, так не скомпилится. только
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Andrey44, без Использования BasicClass.
ведь x и y не объекты. Т.е ты имеешь в виду, что когда мы пишем x(a), y(b), то мы вызываем конструктор по умолчанию BasicClass() ? |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
У BasicClass нет конструктора без параметров.
А ты пытаешься его вызвать.В классе PredClass ты должен обязательно проинициализировать BasicClass вызвав его конструктор. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
в конструкторе PredClass не указан конструктор BasicClass - значит используется BasicClass(), а его нет. x(a), y(b) должно быть в конструкторе BasicClass, а не PredClass. Это ведь члены BasicClass и инициализироваться должны в списке инициализации конструкторов этого класса, а не PredClass. x и y можно присвоить значения в конструкторе PredClass, но не в списке инициализации а присваиванием x = a, а во вторых при наличии BasicClass(int a, int b) смысла в этом нет. Это сообщение отредактировал(а) Fazil6 - 4.11.2008, 12:58 |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Fazil6, Сказал. что так можно сделать используя
|
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
ты не понял. Нельзя такой записью сделать. Я не это имел в виду вот так можно сделать
при этом имеем нарушение инкапсуляции. Не вижу смысла так делать. Это сообщение отредактировал(а) Fazil6 - 4.11.2008, 13:04 |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Нельзя так сделать не вызвав конструктор базового класса. А если у тебя будет
Что тогда делать будешь? -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Спасибо всем за объяснения. Значит если мы хотим инициализировать объект производного класса, мы должны передать значения в конструктор базового класса (если производлный класс использует элементы этого базового класса)?
|
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Я имею в виду, что если в базовом классе есть данные элементы как например x и y, то производный класс используя эти элементы для своих объектов должен инициализировать их только через конструктор базового класса. Передовая ему значения следующим образом:
Это так? |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
так, но производный класс не должен использовать их для своих объектов. x и y объекты базового класса. Как, когда и зачем их инициализировать и использовать определяет только базовый класс. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Fazil6, Я имею ввиду что когда происходит наследование, то в производный класс копируются функции и элементы базового класса. Отсюда слудует что когда создается объект производного класса, то для этого объекта доступны свои this->x и this->y. Это так?
|
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
вообще-то нет.... |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Fazil6, Объясни пожалуйста как тогда, Я уже читал и мне не очень это понятно. Хочу разобраться
|
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Ты знаешь в каком порядке вызываются конструкторы и деструкторы базовых классов и производных от них классов?
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
да вобщем-то добавить к тому что пишут в учебниках мне нечего... в твоем случае при создании объекта класса PredClass создаются объекты родительского класса (x и y), потом объекты класса PredClass (т.е. никаких не создается ибо у него нету никаких) и потом вызываются конструкторы начиная с базового и заканчивая конструктором создаваемого класса. private/protected/public определяют какие члены базовых классов доступны из наследников. Вобщем все. Ничего никуда не копируется |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
х и у это же не объекты, а данные элементы
|
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Ты сам-то хоть понял что написал? -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Объекты это экземпляры пласса, а x и y это составляющие эленты экземпляра класса
|
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
Понятно.
И все-таки в чем сейчас заключается вопрос? Ты хочешь создавать объект производного класса, но не вызывать конструктор базового? -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Andrey44, нет мне не понятно следующее:
когда мы создаем объект производного класса например из моего примера: PredClass obj то когда мы пишем cout<<obj.x или cout<<obj.y, мы печатаем значения для х и у для obj так? (допустим, что x и y объявлены public) А если так, то мне не очень понятно, когда происходит наследование, то (x и y) у каждого объекта производного класса свои? т.е и объекты базового класса имеют свои x и y, и объекты производного класса имеют свои x и y . Вот это можешь объяснить? |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
yngwie19, есть два понятия в ООП объект и класс (тип)
Объект - некоторая абстрактная сущность, которая может иметь внутреннее состояние, и к которой можно применить некоторые действия. Класс - это описание данных, которые хранит объект, и действий, применимых к нему. Механизм расширения описания_объекта (класса) называется наследованием. В Cpp: 1. Наследование реализовано посредством включения объекта базового класса в состав наследника и делегации ему действий (методов). Т.е любой объект-наследник получается собранный из "слоев" описанные чередой классов (предков и наследника). 2. Каждый объект хранит только данные описанные в его классе, например
3. Методы описанные в классе не хранятся в объекте и лишь описывают действия какие применемы к объекту:
A::f() и f() на техническом уровне одно и то же, однако первая запись имеет ряд удобств (скрытый параметр this, описание в одном месте (теле класса), очевидность прав доступа и т.д) Это сообщение отредактировал(а) mes - 4.11.2008, 17:46 |
||||
|
|||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Что-то пока не очень ясно. Ладно всем спасибо пойду читать литературу.
|
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
А что не ясно. Говори точнее. "Вот это" не ясно
-------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Annihilator, Мне не очень понятен механизм наследования. Например что происходит когда Я делаю такой вот код:
1) Конкретно непонятно, когда происходит наследование, то объект two хранит в себе функцию Print(), как он о ней знает? Она копируется в произвдный класс или как-то обращается к базовому классу, чтобы ее использовать ? 2) Что значит при создании объекта производного класса, сначала вызывается конструктор базового класса. Ведь при создании объекта сначала вызывается сначала его конструктор. Вообщем главный вопрос о том как происходит механизм наследования произвожного класса базовым. Добавлено через 3 минуты и 13 секунд да еще не понятно это высказывание
Это сообщение отредактировал(а) yngwie19 - 4.11.2008, 23:47 |
||||
|
|||||
| Annihilator |
|
||||||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
В твоем примере наследования нет. Возможно ты это хотел написать
Глянь. Значение указателей одно и тоже. А вот если уберешь комменты, тем самым переопределив Print() в проиводном классе, то это уже будут разные функции - Basic::Print() и PredClass::Print()
Для того чтобы ты родился, надо ведь чтобы твои родители родились, а для этого в свою очередь нужно родиться бабушкам и дедушкам. Здесь принцип тот же. Тут скорее идет речь о механизме включения/делегирования, чем о классическом наследовании -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
||||||
|
|||||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Что-то вы меня запутали
|
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
...а вот если-бы начинали учить с ассемблера хотя-бы на самом примитивном уровне, то таких проблем с пониманием бы не было...
|
|||
|
||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Да я читал. Sorry, просто глюканул че-то yngwie19, забудь о механизме включения/делегирования -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
J0ker, Я давно хотел начать изучать ассемблер, можете мне посоветовать что-нибудь типа "Ассемблер для чайников" ну чтобы все разжевывали.
|
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Посоветую "Assembler: Учебник для вузов" Юров или "Assembler для Dos, Windows и Unix" Зубков. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 14 минут и 1 секунду допустим имеем
тогда в бесклассовом представлении мы имеем следующее :
Это сообщение отредактировал(а) mes - 5.11.2008, 23:13 |
||||||
|
|||||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
в троке 12 - A a, это зачем? можно без этого Это сообщение отредактировал(а) yngwie19 - 5.11.2008, 23:33 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
затем что наследование (:public A) заменено включением(А а)+делегацией( void f() { a.f(); } ) Это сообщение отредактировал(а) mes - 5.11.2008, 23:35 |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
что такое делегация
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
делегация - передача полномочий другому лицу. В ООП под делегацией подразумевают подмену вызова одного метода вызовом другого метода (обычно другого объекта). |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
mes, и это подмена соответственно реализована путем добавления в производный класс объект базового класса да? Это прям композиция какая-то получается
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
включение и делегация это разные механизмы. "включать" это синоним словосочетания "взять в состав" или "сделать частью" , а не антоним слова "выключать" делегация - это передача вызова
|
||||
|
|||||
| Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Про механизм включение/делегирование а также про делегаты можешь здесь почитать
Троелсен Э. C# и платформа . NET 3.0 Это сообщение отредактировал(а) Annihilator - 6.11.2008, 08:01 -------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |