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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по наследованию 
V
    Опции темы
TaNK
Дата 27.10.2010, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 
#ifndef CLASS_DATE_H_INCLUDED
#define CLASS_DATE_H_INCLUDED
 
#include <iostream>
#include <ctime>
 
using namespace std;
 

// Класс для работы с датой
class Date
{
  public:
           enum Month{jan = 1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec,unk};
 
           Date(int dd = 0, Month mm = Month(0), int year = 0);
 
           //Деструктор
           virtual ~Date(){};

           virtual Date& GetDate();// в процессе        
 
           //TEST
           void Test(Date&);
 
 
  private:
           int day, year, temp;
           Month month;
 
};
 
//Производный класс от Date
class DateTime : public Date
{
  public:
           DateTime(int dd, Month mm, int yy);
           virtual ~DateTime(){};
           virtual DateTime& GetDate(); // в процессе
 
  private:
           int dt_day, dt_year, dt_hour, dt_min, dt_sec;
           Month dt_month;
};
 
#endif // CLASS_DATE_H_INCLUDED



Код

#include "Class_date.h"
// Описание класса для работы с датой
Date::Date(int dd, Month mm, int yy)
{
    day   = dd;
    month = mm;
    year  = yy;
 
}
 
  
void Date::Test(Date& da)
{
    temp = da.day;
    cout << da.year << " " <<temp <<endl;
 
}
 
 
//Производный класс от Date
DateTime::DateTime(int dd, Month mm, int yy)
{
  dt_day   = dd;
  dt_month = mm;
  dt_year  = yy;
  dt_hour  = 0;
  dt_min   = 0;
  dt_sec   = 0;
 
}


Код

 
#include <iostream>
#include "Class_date\\Class_Date_realiz.cpp"
 
 
using namespace std;
 
//=================================================================
int main (int argc, char* argv[]) 
{
 
   Date da(14, Date::Month(3),2007);
   DateTime dt(22,DateTime::Month(11),2009);
 
   da.Test(da);
   dt.Test(dt);
 
 
   return 0;
}



Так вот когда строка  da.Test(da); запускается данные выдает верные день 14 и год 2007
, а когда  dt.Test(dt); по нулям хотя должно быть 22 и 2009 соответсвенно, почему тип DateTime не может привеститсь к типу Date, если он наследуется от Date.



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Crafty
Дата 27.10.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Используйте список инициализации.
Код

//Производный класс от Date
DateTime::DateTime(int dd, Month mm, int yy):
    Date(dd,mm,yy), dt_hour(0), dt_min(0), dt_sec(0)
{
}

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


Шустрый
*


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

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



Код

virtual  void Test(Date&);

Как он сможет увидеть DAteTime из Date?

virtual тут оказался непричем-я глупость написать

Это сообщение отредактировал(а) EgorTheBlade - 27.10.2010, 09:20
PM MAIL Skype   Вверх
azesmcar
Дата 27.10.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



TaNK

При создании потомка для базового вызывается default конструктор, который инициализирует все нулями
Код

Date(int dd = 0, Month mm = Month(0), int year = 0);

что написал то и работает smile 
PM   Вверх
Cheloveck
Дата 27.10.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Дык у тебя в производном классе свои собственные переменные. И конструктор базового ты не вызываешь, а значит он вызывается с дефолтными параметрами - 0, 0, 0. 
PS не хорошо присваивать перечисляемым типам насильно значение, которого нет в перечислении.


--------------------
user posted image
PM Jabber   Вверх
TaNK
Дата 27.10.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Crafty @  27.10.2010,  09:06 Найти цитируемый пост)
Используйте список инициализации.

Огромное Вам спасибо +1.

Добавлено через 2 минуты и 46 секунд
Цитата(azesmcar @  27.10.2010,  09:11 Найти цитируемый пост)
что написал то и работает

да да я уже понял, что не учел инициализацию.

Добавлено через 4 минуты и 23 секунды
Цитата(Cheloveck @  27.10.2010,  09:11 Найти цитируемый пост)
PS не хорошо присваивать перечисляемым типам насильно значение, которого нет в перечислении.

Вы имеете ввиду Month mm = Month(0).
я это у Страуструпа подсмотрел.


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


Опытный
**


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

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



возник еще вопрос - 
вызываю для dt 
Код

dt.GetDate(); // уже переопределена и dt принмает значения текущего вермени (например 27.10.2010 13:59:17)


после этого хочу вызвать еще раз dt.Test(dt); и получить 2010 - год и  27 день
но получаю опять те же данные что и пред идущий вызов Test т.е. 2009 и 22
я так понимаю это из за инициализации, но что тогда делать в этом случае...сделать Test virtual и переопределить в Datetime?


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Cheloveck
Дата 27.10.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(TaNK @  27.10.2010,  13:10 Найти цитируемый пост)
сделать Test virtual и переопределить в Datetime




--------------------
user posted image
PM Jabber   Вверх
TaNK
Дата 28.10.2010, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Cheloveck - понял, спасибо.


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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