Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование и полиморфизм в С++  (Прочитано 44582 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lacrimka
Гость
« : 13-12-2007 16:06 » 

Люди срочно (к 15.12.07) нужна лаба!
суть вот в чем: создать иерархию классов образование и высшее образование. Определить конструктор копирования. Оператор присваивания через соответсвующие функции класса.


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 13-12-2007 16:30 » 

образование
  |
  |
высшее образование

построил иерархию Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 13-12-2007 16:32 » 

а если серьёзно - напиши, как считаешь правильно, а потом помогать будем
« Последнее редактирование: 13-12-2007 17:11 от Алексей1153++ » Записан

Lacrimka
Гость
« Ответ #3 : 13-12-2007 16:44 » 

в общем она есть в таком виде:

Код:
#include <iostream.h>

#include <conio.h>
#include <stdlib.h>
#include <string.h>

class Obrazovanie
{
public:
Obrazovanie (int count = 100);
Obrazovanie ( obrazovanie & obr);
~Obrazovanie ();
virtual void Anketa ();
virtual void Print ();
private:
int vop;
char **mas;
};
Obrazovanie::Obrazovanie (int count)
{
*mas = new char [count];
}

Obrazovanie::Obrazovanie (obrazovanie &obr)
{vop=obr.
mas= new char [obr.count];
for (i=0; i<count: i++)
mas[i]=obr.getMassiv(n);
}

Obrazovanie::~Obrazovanie ()
{
delete []mas;
}

char getMassiv (int n)
{return mas[n]}

void Obrazovanie::Anketa()
{
cout<<"1. Vvedite Im9:"<<endl;
cin>>mas[1];
cout<<"2. Vvedite familiu:"<<endl;
cin>>mas[2];
cout<<"3. Vvedite nomer wkolbI:"<<endl;
cin>>mas[3];
cout<<"4. Vvedite god okon4ani9 wkoLbl:"<<endl;
cin>>mas[4];
}
void Obrazovanie::Print ()
{
vop = 4;
for (int i=0; i<vop; i++)
{
cout<<i+1<<". "<<mas[i+1]<<endl;
}
getch ();
}


class visheeobrazovanie:public Obrazovanie
{private: int vop;
char **mas;
public:
visheeobrazovanie (int count = 100);
~visheeobrazovanie ();
virtual void Anketa ();
virtual void Print ();
};
visheeobrazovanie::visheeobrazovanie (int count)
{
*mas = new char [count];
}
visheeobrazovanie::~visheeobrazovanie ()
{
delete []mas;
}
void visheeobrazovanie::Anketa()
{
cout<<"1. Vvedite nazvanie instituta"<<endl;
cin>>mas[1];
cout<<"2. Vvedite nazvanie fakul'teta"<<endl;
cin>>mas[2];
cout<<"3. Vvedite nazvanie kafedri:"<<endl;
cin>>mas[3];
cout<<"4. Vvedite god okonchania instituta:"<<endl;
cin>>mas[4];
}
void visheeobrazovanie::Print ()
{
vop = 4;
for (int i=0; i<vop; i++)
{
cout<<i+1<<". "<<mas[i+1]<<endl;
}
getch ();
}


void main ()
{
clrscr ();
Obrazovanie *obr=new Obrazovanie(100);
obr->Anketa();
obr->Print ();
visheeobrazovanie *obr1=new visheeobrazovanie(100);
obr1->Anketa();
obr1->Print ();
delete obr;
}
« Последнее редактирование: 13-12-2007 17:10 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 13-12-2007 17:13 » 

щас покопаемся )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 13-12-2007 17:33 » 

Код:
	Obrazovanie ( obrazovanie & obr);

почему obrazovanie  - с маленькой буквы ? Регистр идентификаторов в с++ имеет значение

Код:
	mas= new char [obr.count];

count - надо сделать членом класса (m_count) и инициализировать в конструкторе (см код ниже).

А ещё нужно проверить на корректность это значение в конструкторе - это сама (девушка вроде?) делай


в классе у тебя
   char **mas;
 - почему указатель на указатель ?
   char *mas; - тебе надо просто указатель

опечатки
Код:
Obrazovanie::Obrazovanie (Obrazovanie &obr)
{
ТУТ1     vop=obr.
mas= new char [obr.m_count];
ТУТ2     for (i=0; i<count: i++)
mas[i]=obr.getMassiv(n);
}
в первом - не дописала, полагаю obr.m_count , во втором - надо точку с запятой, а не двоеточие. И i не определено

Код:
mas[i]=obr.getMassiv(n); 
n - не определено , его там и не надо ))

работа с указателями - надо копировать массив , а не указатель (см код ниже)



char getMassiv (int n)
 - надо сделать членом класса и вертать должно не char а char*


clrscr ();
 - наверное верно, но у меня не нашлась функция ((

результат , который компилится:
Код:
#include <iostream.h>

#include <conio.h>
#include <stdlib.h>
#include <string.h>

class Obrazovanie
{
public:
Obrazovanie (int count = 100);
Obrazovanie ( Obrazovanie & obr);
~Obrazovanie ();
virtual void Anketa ();
virtual void Print ();
char* getMassiv ();

int m_count;
private:
int vop;
char *mas;
};
Obrazovanie::Obrazovanie (int count) : m_count(count)
{
mas = new char [m_count];
}

Obrazovanie::Obrazovanie (Obrazovanie &obr)
{
vop=obr.m_count;
mas= new char [obr.m_count];
for (int i=0; i<obr.m_count; i++)
{
::memmove(mas,obr.getMassiv(),obr.m_count);
//mas=obr.getMassiv(i);// n ??
}
}

Obrazovanie::~Obrazovanie ()
{
delete []mas;
}

char* Obrazovanie::getMassiv()
{
return mas;
}

void Obrazovanie::Anketa()
{
cout<<"1. Vvedite Im9:"<<endl;
cin>>mas[1];
cout<<"2. Vvedite familiu:"<<endl;
cin>>mas[2];
cout<<"3. Vvedite nomer wkolbI:"<<endl;
cin>>mas[3];
cout<<"4. Vvedite god okon4ani9 wkoLbl:"<<endl;
cin>>mas[4];
}
void Obrazovanie::Print ()
{
vop = 4;
for (int i=0; i<vop; i++)
{
cout<<i+1<<". "<<mas[i+1]<<endl;
}
getch ();
}


class visheeobrazovanie:public Obrazovanie
{private: int vop;
char **mas;
public:
visheeobrazovanie (int count = 100);
~visheeobrazovanie ();
virtual void Anketa ();
virtual void Print ();
};
visheeobrazovanie::visheeobrazovanie (int count)
{
*mas = new char [count];
}
visheeobrazovanie::~visheeobrazovanie ()
{
delete []mas;
}
void visheeobrazovanie::Anketa()
{
cout<<"1. Vvedite nazvanie instituta"<<endl;
cin>>mas[1];
cout<<"2. Vvedite nazvanie fakul'teta"<<endl;
cin>>mas[2];
cout<<"3. Vvedite nazvanie kafedri:"<<endl;
cin>>mas[3];
cout<<"4. Vvedite god okonchania instituta:"<<endl;
cin>>mas[4];
}
void visheeobrazovanie::Print ()
{
vop = 4;
for (int i=0; i<vop; i++)
{
cout<<i+1<<". "<<mas[i+1]<<endl;
}
getch ();
}


void main ()
{
clrscr ();
Obrazovanie *obr=new Obrazovanie(100);
obr->Anketa();
obr->Print ();
visheeobrazovanie *obr1=new visheeobrazovanie(100);
obr1->Anketa();
obr1->Print ();
delete obr;
}

код я не отлаживал - делай тесты и пиши результаты сюда )

« Последнее редактирование: 13-12-2007 17:35 от Алексей1153++ » Записан

Lacrimka
Гость
« Ответ #6 : 13-12-2007 17:54 » 

ок. спасибо, сейчас доведу её до "блеска"
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-12-2007 20:25 » 

Что всё это означает?

Где наследование и, самое главное, полиморфизм???

Это ООП или курсы по C++? Если ООП, я за такое "неуд." ставлю сразу - никакого подхода не наблюдается, одно программирование классов без всякого понимания.

Тут ещё до наследования по инкапсуляции и интерфейсу полный провал.

Алексей1153++, ты чему учишь?? И баги в коде к тому же...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 13-12-2007 20:30 » 

dimka, апсолютно ни чему не учу ) Просто сделал, чтобы компилилось, ибо море просто опечаток.

то, что код не рабочий - это и так понятно, просто не запустив его она этого и не поймёт
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 14-12-2007 12:25 » 

деструктор кстати не виртуальный
char **
замени на набор нормальных std::string
std::string fac;
std::strinf inst; и т.д. не дело такие данные хранить в каком-то char ** можно поиспользовать std::map<std::string, std::string>

все внутренние структуры нужно в private или protected
метотоды не изменяющие состояние должны быть const

для методов Anketa/Print в наследнике лучше в твоём случае сначала вызывать метод родителя, а потом потомка, что бы небыло дублирования кода да и правильней это
Записан

Странно всё это....
Lacrimka
Гость
« Ответ #10 : 14-12-2007 15:51 » 

деструктор кстати не виртуальный
char **
замени на набор нормальных std::string
std::string fac;
std::strinf inst; и т.д. не дело такие данные хранить в каком-то char ** можно поиспользовать std::map<std::string, std::string>

дело в том что наш препод питает необыкновенную любовь к указателям.


Цитата
Где наследование и, самое главное, полиморфизм???

Это ООП или курсы по C++? Если ООП, я за такое "неуд." ставлю сразу - никакого подхода не наблюдается, одно программирование классов без всякого понимания.

Тут ещё до наследования по инкапсуляции и интерфейсу полный провал.

а на каком уровне вам нужен полиморфизм? когда у нас на него одна единственная лаба. что успели сказать то мы и делаем. тоже самое было с инкапсуляцией. объяснили что это сокрытие части части класса от пользователя и хватит. у нас лаба была сдвоеная. половина лабы на списки, вторая на классы. какие уж тут знания!
« Последнее редактирование: 14-12-2007 15:53 от Lacrimka » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 14-12-2007 15:54 » 

Lacrimka, ага, я , кстати, тоже обожаю с указателями возиться )) Столько удовольствия. А эти некрасивые std ...
Записан

Lacrimka
Гость
« Ответ #12 : 14-12-2007 16:00 » 

Lacrimka, ага, я , кстати, тоже обожаю с указателями возиться )) Столько удовольствия. А эти некрасивые std ...
ну что с ним поделаешь какой есть такой есть.
у нашей группы вообще урезанный курс информатики, на три семестра меньше чем у всех остальных
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 14-12-2007 16:30 » 

Lacrimka, плохо, что урезанный )
Записан

Lacrimka
Гость
« Ответ #14 : 14-12-2007 17:11 » 

Lacrimka, плохо, что урезанный )
вот и мы о том же. изначально у нас должно было быть шесть лаб в этом семестре, но нам оставили только четыре за которые нужно было успеть сделать все шесть.
и почему-то считается, что робототехники должны лучше знать внутреннюю механику роботов, чем уметь их программировать!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 14-12-2007 17:21 » 

вау, клёвая специальность )  даже завидно немного Улыбаюсь
Записан

Lacrimka
Гость
« Ответ #16 : 14-12-2007 17:26 » 

вау, клёвая специальность )  даже завидно немного Улыбаюсь
хм. я бы завидовать не стала))) чувствую что пошла не в свой институт.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 14-12-2007 17:47 » 

да не, отличная спецуха
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 14-12-2007 22:53 » 

Цитата: Lacrimka
а на каком уровне вам нужен полиморфизм?
А у него есть уровни?

Полиморфизм бывает 2-х видов:
- один заключается в том, что объявляются методы (в терминах С++ функции) с одинаковым названием, но разным количеством и/или типом параметров, а также типом результата.
- второй заключается в том, что в субклассах переопределяются методы суперкласса, а вызов метода во время исполнения происходит при помощи позднего связывания (в терминах С++ функции-члены являются виртуальными).

Но это так, для справки.

Главное здесь не навык написания виртуальных функций-членов, а умение их применять при решении задач. У тебя задача вообще не поставлена, следовательно, при помощи этой программы ты мало чему научишься. В программе совершенно не видно то, для чего в ней этот полиморфизм использован. Отсутствие постановки задачи как раз и вызывает провал в определении интерфейсов, что, в свою очередь, ведёт к неосознанному нарушению инкапсуляции. Всё это вместе свидетельствует об отсутствии систематизированных знаний по ООП, причиной чего являются, скорее всего, невнятные лабораторные работы.

Полиморфизм (от греч. "много форм" или "многообразие") в терминах классов означает, что объект (экземпляр класса) одновременно относится как к своему непосредственному классу, так и ко всем его суперклассам. Это позволяет объекту быть представленным в разных частях системы с помощью разных "форм", определяемых классами его иерархии. И это же позволяет отделить понятие "посылка сообщения" от понятия "вызов метода", ибо в силу полиморфизма неизвестно точно, как будет реагировать неизвестный объект на посланное ему сообщение.

Простейший пример:
Код: (C++)
#include <iostream>

class X {
  public:
    virtual void f() { std::cout << "X" << std::endl; }
};

class Y : public X {
  public:
    virtual void f() { std::cout << "Y" << std::endl; }
};

void g(X *x) {
  x->f();
}

int main() {
  // Пример 1
  X *os[] = { new X(), new Y() };
  for(int i = 0; i < 2; ++i) {
    os[i]->f();
    delete os[i];
  }
  // Пример 2
  g(&X());
  g(&Y());
}
« Последнее редактирование: 15-12-2007 06:51 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #19 : 15-12-2007 06:15 » 

Алексей1153++, вот честное слово, у нас ты бы за такое по рукам тут же получил. Улыбаюсь

dimka, забыл статический полиморфизе

вот мой вариант. Прошу заметить нет указателей(точнее есть один указатель на функцию), если утечки памяти и будут, то уж точно не из-за мойх new/delete
Код:
#include <iostream>
#include <string>

typedef void (*action_type)(const std::string&);

class BaseEducation
{
public:
virtual poll() = 0;
virtual print_poll(action_type) const = 0;
virtual ~BaseEducation(){};

};

class Education : public BaseEducation
{
public:
Education() : BaseEducation(){}
virtual poll()
{
std::cout << "School?\n";
std::cin >> school_;
}

virtual print_poll(action_type a) const
{
a(std::string("School: ") + school_ + "\n");
}
virtual ~Education(){}
private:
std::string school_;
};

class HiEducation : public Education
{
public:
HiEducation() : Education(){}
virtual poll()
{
Education::poll();
std::cout << "College?\n";
std::cin >> college_;
}

virtual print_poll(action_type a) const
{
Education::print_poll(a);
a(std::string("College: ") + college_ + "\n");
}
virtual ~HiEducation(){}
private:
std::string college_;
};

void print_cout(const std::string & s)
{
std::cout << s;
}

void test_poli(BaseEducation& edu)
{
edu.poll();
edu.print_poll(&print_cout);
}

int _tmain(int argc, _TCHAR* argv[])
{
{
std::cout << "Test Education\n";
Education edu;
test_poli(edu);
std::cout << std::endl;
}
{
std::cout << "Test HiEducation\n";
HiEducation edu;
test_poli(edu);
std::cout << std::endl;
}

return 0;
}
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 17-12-2007 11:55 » 

http://www.lava.se/sam/
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Lacrimka
Гость
« Ответ #21 : 18-12-2007 12:47 » 

вот мой вариант. Прошу заметить нет указателей(точнее есть один указатель на функцию), если утечки памяти и будут, то уж точно не из-за мойх new/delete
зато в нем есть 25 ошибок.)))
тут кто-то сказал что на такой задаче я не пойму смысл полиморфизма. дело в том, что методичку писал наш лектор и там все задачи абсолютно тупые!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 18-12-2007 14:04 » 

Цитата: Lacrimka
тут кто-то сказал что на такой задаче я не пойму смысл полиморфизма. дело в том, что методичку писал наш лектор и там все задачи абсолютно тупые!
Я сказал Улыбаюсь. Задача должна быть, с одной стороны, простой, с другой стороны, решение задачи должно быть "иллюстрацией" к теме, с третьей стороны, задача не должна решаться не так, как задумывалось преподавателем. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #23 : 18-12-2007 14:54 » 

вот мой вариант. Прошу заметить нет указателей(точнее есть один указатель на функцию), если утечки памяти и будут, то уж точно не из-за мойх new/delete
зато в нем есть 25 ошибок.)))
тут кто-то сказал что на такой задаче я не пойму смысл полиморфизма. дело в том, что методичку писал наш лектор и там все задачи абсолютно тупые!

Брехня. Улыбаюсь У меня отлично компилится и работает. я стараюсь всё проверять перед тем, как выложить.
Компилил в VC++.2003 + STLPort(стандартная для меня среда)
Записан

Странно всё это....
Lacrimka
Гость
« Ответ #24 : 18-12-2007 15:19 » 

а что такое memmove?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 18-12-2007 19:27 » 

Lacrimka, копирует участок памяти

void *memmove(
   void *dest,
   const void *src,
   size_t count
);

 dest - указатель на приёмный буфер
 src - указатель на буфер - источник
 count - количество байт, которое надо скопировать. При задании count учитывать размеры обоих буферов - чтобы не вылезти за границы.
Записан

Lacrimka
Гость
« Ответ #26 : 25-12-2007 05:15 » 

Алексей1153++, а у меня приняли твой код! поставили четыре))))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #27 : 25-12-2007 15:27 » 

Lacrimka, это случайность Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #28 : 25-12-2007 22:56 » 

Лёшка, дык ёлы-палы. Чё на пятёрку не смог сделать? Два наряда вне очереди.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 26-12-2007 14:10 » 

виноват, исправлюсь  Гы-гы-гы
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines