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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про наследование 
:(
    Опции темы
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   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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