Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про наследование 
:(
    Опции темы
yngwie19
Дата 4.11.2008, 11:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Правильно ли Я понимаю?
Допустим есть класс BasicClass (базовый класс) и ProdClass (производный от него класс):

Код

#include <iostream>

using namespace std;

class BasicClass
{
  public:
       BasicClass(int a, int b){ x = a; y = b;}
       void Print() {cout<<x<<' '<<y;}
  protected:
       int x,y;     
};

class PredClass : public BasicClass
{
    PredClass(int a, int b) : BasicClass
    {;}
};


Вопрос.

Правильно ли Я понимаю, что когда мы в main пишем
Код

BasicClass obj1(0,0);
PredClass obj2(15,20);

obj2.Print();


то на печать выходит 15,20, т.к x и y относятяся к объекту PredClass


Это сообщение отредактировал(а) yngwie19 - 4.11.2008, 11:23
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Все так и будет. smile 
Только x и y не относятся к объекту PredClass.

Это сообщение отредактировал(а) Andrey44 - 4.11.2008, 11:27


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 4.11.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44, Ну понятно что они не описаны в классе PredClass, но они наследуются от класса BasicClass, значит как-бы относятся. Или Я ошибаюсь

Добавлено через 3 минуты и 5 секунд
Andrey44, А мы можем как-нибудь инициализировать x и y для объекта PrebClass, не используя конструктор BasicClass ?
PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  11:22 Найти цитируемый пост)
то на печать выходит 15,20, т.к x и y относятяся к объекту PredClass

нет. Это не скомпилится. 
должно быть
Код

class PredClass : public BasicClass
{
    PredClass(int a, int b) : BasicClass(a, b)
    {;}
};

и делать  x и y protected не нужно. Лучше private

Добавлено через 3 минуты и 17 секунд
Цитата(yngwie19 @  4.11.2008,  11:29 Найти цитируемый пост)
А мы можем как-нибудь инициализировать x и y для объекта PrebClass, не используя конструктор BasicClass ? 

если они protected, то это возможно при наличии у  BasicClass конструктора поумолчанию
Код

class BasicClass
{
  public:
BasicClass() {}
       BasicClass(int a, int b){ x = a; y = b;}
       void Print() {cout<<x<<' '<<y;}
  protected:
       int x,y;     
};
class PredClass : public BasicClass
{
    PredClass(int a, int b) : x(a), y(b)
    {;}
};

но строго говоря - это нарушение инкапсуляции
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(Fazil6 @  4.11.2008,  11:34 Найти цитируемый пост)
это возможно при наличии у  BasicClass конструктора поумолчанию


А зачем тут Конструктор по умолчанию?
PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  11:42 Найти цитируемый пост)
А зачем тут Конструктор по умолчанию? 

ну если ты не хочешь использовать конструктор BasicClass(int a, int b), то нужно же каким-то другим конструктором инициализировать базовый класс

Добавлено через 3 минуты и 11 секунд
а вообще, повторяю, то о чем ты спрашиваешь возможно, но так делать не стоит.
Код

class PredClass : public BasicClass 

это наследование интерфейса
Код

 protected:
       int x,y;  

это наследование реализации

PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Fazil6,  т.е так Я сделать не смогу?

Код

class BasicClass
{
  public:
       BasicClass(int a, int b){ x = a; y = b;}
       void Print() {cout<<x<<' '<<y;}
  protected:
       int x,y;     
};
class PredClass : public BasicClass
{
    PredClass(int a, int b) : x(a), y(b)
    {;}
};


PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  12:04 Найти цитируемый пост)
Fazil6,  т.е так Я сделать не смогу?

ну попробуй и увидишь. Оно ведь не скомпиллится.
Код

PredClass(int a, int b) : x(a), y(b)  // при инициализации объекта 
// для базового класса используется конструктор поумолчанию
    {;}

но так как ты определил конструктор 
Код

BasicClass(int a, int b)

то конструктор поумолчанию компиллятором не генерится и его нет
Если ты дополнительно определишь конструктор BasicClass() , то работать это будет, только как грится через Ж..У. 
Переменные должны инициализироваться в том классе, в котором они определены. Почитай про порядок создания объектов и инициализацию их членов. 
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yngwie19 @  4.11.2008,  12:04 Найти цитируемый пост)
т.е так Я сделать не смогу?

Нет, так не скомпилится.
только 
Код

class BasicClass
{
public:
    BasicClass(int a, int b){ x = a; y = b;}
    //void Print() {cout<<x<<' '<<y;}
protected:
    int x,y;     
};
class PredClass : public BasicClass
{
    PredClass(int a, int b) : BasicClass(a, b)
    {}
};



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 4.11.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44, без Использования BasicClass.


Цитата(Fazil6 @  4.11.2008,  12:19 Найти цитируемый пост)
PredClass(int a, int b) : x(a), y(b)  // при инициализации объекта 
// для базового класса используется конструктор поумолчанию
    {;}

ведь x и y не объекты.

Т.е ты имеешь в виду, что когда мы пишем  x(a), y(b), то мы вызываем конструктор по умолчанию BasicClass()  ? 
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



У BasicClass нет конструктора без параметров.
А ты пытаешься его вызвать.В классе PredClass ты должен обязательно проинициализировать BasicClass вызвав его конструктор.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 4.11.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  12:34 Найти цитируемый пост)
Т.е ты имеешь в виду, что когда мы пишем  x(a), y(b), то мы вызываем конструктор по умолчанию BasicClass()  ?  

в конструкторе 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
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Fazil6, Сказал. что так можно сделать используя 

Код

PredClass(int a, int b) : x(a), y(b) 

PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  12:58 Найти цитируемый пост)
Fazil6, Сказал. что так можно сделать используя 

ты не понял. Нельзя такой записью сделать. Я не это имел в виду
вот так можно сделать
Код

class BasicClass
{
  public:
       BasicClass() {}  // или добавить этот конструктор
       BasicClass(int a = 0, int b = 0): x(a), y(b){ } // или изменить вот так этот
       void Print() {cout<<x<<' '<<y;}
  protected:
       int x,y;     
};
class PredClass : public BasicClass
{
    PredClass(int a, int b) 
    { x = a;
       y = b;}
};

при этом имеем нарушение инкапсуляции.
Не вижу смысла так делать. 

Это сообщение отредактировал(а) Fazil6 - 4.11.2008, 13:04
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yngwie19 @  4.11.2008,  12:58 Найти цитируемый пост)
что так можно сделать

Нельзя так сделать не вызвав конструктор базового класса.
А если у тебя будет 
Код

class MostBasicClass
{
    MostBasicClass(char ch){_ch = ch;}
..............
char _ch;
}
class BasicClass : public MostBasicClass
{

    BasicClass(int a, int b){ x = a; y = b;}

protected:
    int x,y;     
};
class PredClass : public BasicClass
{
    
};

Что тогда делать будешь?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 4.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Спасибо всем за объяснения. Значит если мы хотим инициализировать объект производного класса, мы должны передать значения в конструктор базового класса (если производлный класс использует элементы этого базового класса)?
PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



это 
Цитата(yngwie19 @  4.11.2008,  13:55 Найти цитируемый пост)
Значит если мы хотим инициализировать объект производного класса, мы должны передать значения в конструктор базового класса 

и
Цитата(yngwie19 @  4.11.2008,  13:55 Найти цитируемый пост)
(если производлный класс использует элементы этого базового класса)

никак между собой не связано
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Я имею в виду, что если в базовом классе есть данные элементы как например x и y, то производный класс используя эти элементы для своих объектов должен инициализировать их только через конструктор базового класса. Передовая ему значения следующим образом:
Код

PredClass(int a, int b) : BasicClass(a, b)
{;}


Это так?
PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  14:25 Найти цитируемый пост)
Это так? 

так, но 
Цитата(yngwie19 @  4.11.2008,  14:25 Найти цитируемый пост)
производный класс используя эти элементы для своих объектов

производный класс не должен использовать их для своих объектов. 
x и y объекты базового класса. Как, когда и зачем их инициализировать и использовать определяет только базовый класс. 
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Fazil6, Я имею ввиду что когда происходит наследование, то в производный класс копируются функции и элементы базового класса. Отсюда слудует что когда создается объект производного класса, то для этого объекта доступны свои this->x и this->y. Это так?
PM MAIL   Вверх
Fazil6
Дата 4.11.2008, 15:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  14:57 Найти цитируемый пост)
Fazil6, Я имею ввиду что когда происходит наследование, то в производный класс копируются функции и элементы базового класса. Отсюда слудует что когда создается объект производного класса, то для этого объекта доступны свои this->x и this->y. Это так? 

вообще-то нет....
Цитата(Fazil6 @  4.11.2008,  12:19 Найти цитируемый пост)
Почитай про порядок создания объектов и инициализацию их членов. 

PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Fazil6,  Объясни пожалуйста как тогда, Я уже читал и мне не очень это понятно. Хочу разобраться
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Ты знаешь в каком порядке вызываются конструкторы и деструкторы базовых классов и производных от них классов?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 4.11.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  15:13 Найти цитируемый пост)
Fazil6,  Объясни пожалуйста как тогда, Я уже читал и мне не очень это понятно. Хочу разобраться 

да вобщем-то добавить к тому что пишут в учебниках мне нечего...
в твоем случае при создании объекта класса PredClass создаются объекты родительского класса (x и y), потом объекты класса PredClass (т.е. никаких не создается ибо у него нету никаких) и потом вызываются конструкторы начиная с базового и заканчивая конструктором создаваемого класса. 
private/protected/public определяют какие члены базовых классов доступны из наследников. Вобщем все. Ничего никуда не копируется
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



х и у это же не объекты, а данные элементы 
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yngwie19 @  4.11.2008,  15:37 Найти цитируемый пост)
х и у это же не объекты, а данные элементы  

Ты сам-то хоть понял что написал?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 4.11.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(yngwie19 @  4.11.2008,  15:37 Найти цитируемый пост)
х и у это же не объекты, а данные элементы  

а что такое по твоему "данные элементы" и чем они отличаются от объектов?
PM MAIL   Вверх
yngwie19
Дата 4.11.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Объекты это экземпляры пласса, а x и y это составляющие эленты экземпляра класса
PM MAIL   Вверх
Andrey44
Дата 4.11.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Понятно.
И все-таки в чем сейчас заключается вопрос?
Ты хочешь создавать объект производного класса, но не вызывать конструктор базового?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 4.11.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44, нет мне не понятно следующее:
когда мы создаем объект производного класса например из моего примера:
PredClass obj
то когда мы пишем
cout<<obj.x или cout<<obj.y, мы печатаем значения для х и у для obj так? (допустим, что x и y объявлены public)

А если так, то мне не очень понятно, когда происходит наследование, то (x и y) у каждого объекта производного класса свои? т.е и объекты базового класса имеют свои x и y, и объекты производного класса имеют свои x и y . Вот это можешь объяснить?
PM MAIL   Вверх
mes
Дата 4.11.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



yngwie19, есть два понятия в ООП объект и класс (тип)
Объект - некоторая абстрактная сущность, которая может иметь внутреннее состояние, и к которой можно применить некоторые действия.
Класс - это описание данных, которые хранит объект, и действий, применимых к нему.
Механизм расширения описания_объекта (класса) называется наследованием.

В Cpp: 
1. Наследование реализовано посредством включения объекта базового класса в состав наследника и делегации ему действий (методов).
Т.е любой объект-наследник получается собранный из "слоев" описанные чередой классов (предков и наследника). 

2. Каждый объект хранит только данные описанные в его классе, например
Код

class A : public Base {int a; int b;} 
хранит в себе объект класса Base и два (pod) объекта класса int.

3. Методы описанные в классе не хранятся в объекте и лишь описывают действия какие применемы к объекту:
Код

class A { void f(int a) { std::cout << a; } } 
void f (A *this, int a){ std::cout << a; }

A::f() и f() на техническом уровне одно и то же, однако первая запись имеет ряд удобств (скрытый параметр this, описание в одном месте (теле класса), очевидность прав доступа и т.д)

Это сообщение отредактировал(а) mes - 4.11.2008, 17:46


--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 4.11.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Что-то пока не очень ясно. Ладно всем спасибо пойду читать литературу.
PM MAIL   Вверх
Annihilator
Дата 4.11.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



А что не ясно. Говори точнее. "Вот это" не ясно  smile 


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
yngwie19
Дата 4.11.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Annihilator, Мне не очень понятен механизм наследования. Например что происходит когда Я делаю такой вот код:
Код

Class Basic
{
    public:
         Basic(int a) {x = a;}
         Print() {cout<<x<<endl;}
    private:
         int x;
};

Class PredClass()
{
     public:
          PredClass(int a) : Basic(a)
          {y = a;}
     private:
         y; 
}

 void main(void)
{
     Basic one(10);
     one.Print();

     PredClass two(20);
     two.Print();
}


1) Конкретно непонятно, когда происходит наследование, то объект two хранит в себе функцию Print(), как он о ней знает? Она копируется в произвдный класс или как-то обращается к базовому классу, чтобы ее использовать ?
2) Что значит при создании объекта производного класса, сначала вызывается конструктор базового класса. Ведь при создании объекта сначала вызывается сначала его конструктор.

Вообщем главный вопрос о том как происходит механизм наследования произвожного класса базовым.

Добавлено через 3 минуты и 13 секунд
да еще не понятно это высказывание 
Цитата

В Cpp: 
1. Наследование реализовано посредством включения объекта базового класса в состав наследника и делегации ему действий (методов).
Т.е любой объект-наследник получается собранный из "слоев" описанные чередой классов (предков и наследника). 



Это сообщение отредактировал(а) yngwie19 - 4.11.2008, 23:47
PM MAIL   Вверх
Annihilator
Дата 5.11.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



В твоем примере наследования нет. Возможно ты это хотел написать  smile 
Код

#include<iostream>
class Basic
{
    public:
         Basic(int a) {x = a;}
         void Print() {std::cout<<x<<std::endl;}
    private:
         int x;
};

class PredClass: public Basic
{
     public:
          PredClass(int a) : Basic(a)
          {y = a;}
     private:
         int y; 
};

 void main(void)
{
     Basic one(10);
     one.Print();
     PredClass two(20);
     two.Print();
}

Цитата(yngwie19 @  5.11.2008,  03:45 Найти цитируемый пост)
или как-то обращается к базовому классу

Код

#include<iostream>
class Basic
{
    public:
         Basic(int a) {x = a;}
         void Print() {std::cout<<x<<std::endl;}
    private:
         int x;
};

class PredClass: public Basic
{
     public:
        // void Print(); 
         PredClass(int a) : Basic(a)
          {y = a;}
     private:
         int y; 
};
//void PredClass::Print()
//{
//    std::cout << "In PredClass" << y << std::endl;
//}

 void main(void)
{
    void (Basic::*p)(); 
    Basic one(10);
    p=&Basic::Print;
    void (PredClass::*m)(); 
    PredClass two(20);
    m=&PredClass::Print;
}


Глянь. Значение указателей одно и тоже. А вот если уберешь комменты, тем самым переопределив Print() в проиводном классе, то это уже будут разные функции - Basic::Print() и PredClass::Print()
Цитата(yngwie19 @  5.11.2008,  03:45 Найти цитируемый пост)
Что значит при создании объекта производного класса, сначала вызывается конструктор базового класса

Для того чтобы ты родился, надо ведь чтобы твои родители родились, а для этого в свою очередь нужно родиться бабушкам и дедушкам. Здесь принцип тот же.

Цитата(yngwie19 @  5.11.2008,  03:45 Найти цитируемый пост)
да еще не понятно это высказывание ЦитатаВ Cpp: 1. Наследование реализовано посредством включения объекта базового класса в состав наследника и делегации ему действий (методов).Т.е любой объект-наследник получается собранный из "слоев" описанные чередой классов (предков и наследника). 

Тут скорее идет речь о механизме включения/делегирования, чем о классическом наследовании


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Fazil6
Дата 5.11.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Annihilator @  5.11.2008,  18:10 Найти цитируемый пост)
Тут скорее идет речь о механизме включения/делегирования, чем о классическом наследовании 

ты бы прочитал вначале прежде чем коментировать... Как раз о наследовании там речь и все правильно написано.
PM MAIL   Вверх
yngwie19
Дата 5.11.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Что-то вы меня запутали
PM MAIL   Вверх
J0ker
Дата 5.11.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



...а вот если-бы начинали учить с ассемблера хотя-бы на самом примитивном уровне, то таких проблем с пониманием бы не было...


--------------------
user posted image
PM MAIL   Вверх
Annihilator
Дата 5.11.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(Fazil6 @  6.11.2008,  00:05 Найти цитируемый пост)
ты бы прочитал вначале прежде чем коментировать...

Да я читал. Sorry, просто глюканул че-то  smile 

yngwie19, забудь о механизме включения/делегирования smile


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
yngwie19
Дата 5.11.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



J0ker, Я давно хотел начать изучать ассемблер, можете мне посоветовать что-нибудь типа "Ассемблер для чайников" ну чтобы все разжевывали.
PM MAIL   Вверх
IKM2007
Дата 5.11.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(yngwie19 @  5.11.2008,  22:12 Найти цитируемый пост)
J0ker, Я давно хотел начать изучать ассемблер, можете мне посоветовать что-нибудь типа "Ассемблер для чайников" ну чтобы все разжевывали.

Посоветую "Assembler: Учебник для вузов" Юров или "Assembler для Dos, Windows и Unix" Зубков.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 5.11.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  4.11.2008,  23:45 Найти цитируемый пост)
да еще не понятно это высказывание 
Цитата

В Cpp: 
1. Наследование реализовано посредством включения объекта базового класса в состав наследника и делегации ему действий (методов).
Т.е любой объект-наследник получается собранный из "слоев" описанные чередой классов (предков и наследника). 



Код

class A
{
 public:
   void f  () { i+=1;}
   void f1() { i-=1; }
  private:
  int i;
};
рассмотрим класс B
class B //без  наследования
{
  А а;
 public:
   void f()  { a.f();  } 
   void f1() { a.f1(); }
}; 

class B :public A  // с наследованием
{
  // тут черную работу сделал компилятор
};





Добавлено через 14 минут и 1 секунду
Цитата(yngwie19 @  4.11.2008,  23:45 Найти цитируемый пост)
1) Конкретно непонятно, когда происходит наследование, то объект two хранит в себе функцию Print(), как он о ней знает? Она копируется в произвдный класс или как-то обращается к базовому классу, чтобы ее использовать ?

допустим имеем 
Код

class A
{
 public:
   void f  () { i+=1;}
   void f1() { i-=1; }
  private:
  int i;
};

class B :public A  { };

тогда в бесклассовом представлении  мы имеем следующее :
Код

//class A

struct data_of_class_A
{
  int i;
};

func_of_class_A_f(data_of_class_A *this)
{
  this->i+=1;
}

func_of_class_A_f1(data_of_class_A *this)
{
  this->i-=1;
}
//class B

struct data_of_class_B
{
   data_of_class_A  inherited_data;
};

func_of_class_B_f(data_of_class_B *this)
{
    func_of_class_A_f (&this->inherited_data);
}

func_of_class_B_f1(data_of_class_B *this)
{
    func_of_class_A_f1 (&this->inherited_data);
}






Это сообщение отредактировал(а) mes - 5.11.2008, 23:13


--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 5.11.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(mes @  5.11.2008,  23:11 Найти цитируемый пост)

Код



class A
{
 public:
   void f  () { i+=1;}
   void f1() { i-=1; }
  private:
  int i;
};
рассмотрим класс B
class B //без  наследования
{
  А а;
 public:
   void f()  { a.f();  } 
   void f1() { a.f1(); }
}; 

class B :public A  // с наследованием
{
  // тут черную работу сделал компилятор
};

 в троке  12 - A a, это зачем? можно без этого

Это сообщение отредактировал(а) yngwie19 - 5.11.2008, 23:33
PM MAIL   Вверх
mes
Дата 5.11.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  5.11.2008,  23:30 Найти цитируемый пост)
 в троке A a, это зачем? можно без этого

затем что наследование (:public A) заменено включением(А а)+делегацией( void f()  { a.f();  } )



Это сообщение отредактировал(а) mes - 5.11.2008, 23:35


--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 5.11.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



что такое делегация
PM MAIL   Вверх
mes
Дата 6.11.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  5.11.2008,  23:41 Найти цитируемый пост)
что такое делегация 

делегация - передача полномочий другому лицу. 

В ООП под делегацией подразумевают подмену  вызова одного метода  вызовом  другого метода (обычно другого объекта).



--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 6.11.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



mes, и это подмена соответственно реализована путем добавления в производный класс объект базового класса да? Это прям композиция какая-то получается 
PM MAIL   Вверх
mes
Дата 6.11.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  6.11.2008,  00:38 Найти цитируемый пост)
mes, и это подмена соответственно реализована путем добавления в производный класс объект базового класса да? Это прям композиция какая-то получается  

включение и  делегация это разные механизмы.
"включать" это синоним словосочетания "взять в состав" или "сделать частью" , а не антоним слова "выключать"
делегация - это передача вызова 

Код

void f_delegat() { ... }
void f() { f_delegat();} // делегация

struct A
{
   int i;
}
struct B
{
   A a; // включение
};






--------------------
PM MAIL WWW   Вверх
Annihilator
Дата 6.11.2008, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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ошо
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.