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

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

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

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

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


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

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


 




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


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

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