Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Наследование


Автор: Ambition 20.8.2007, 09:33
Необходимо написать программку на С++ по теме Наследование. Не могу даже оттолкнуться от чего-либо  smile . Вот условие:
Имеется 3 исходные кафедры: Экономики, Права и Управления информационными ресурсами.
На каждой кафедре работает коллектив преподавателей, причем каждый имеет свою должность, звание, стаж работы, семейное положение.
Вывести всех преподавателей, имеющих многодетные семьи (больше 2-ух детей).
Заранее спасибо, кто ответит


Автор: sentry 20.8.2007, 09:45
Не понял, где тут наследование? Есть кафедра, есть преподаватель. Но кафедра это не преподаватель, а преподаватель это не кафедра smile
К тому же по кафедрам вообще никаких данных, кроме названия нет. Да и вообще условие не понятно: нужно вывести всех многодетных 
преподавателей, зачем тут вообще кафедры?

Автор: MAKCim 20.8.2007, 09:51
Ambition
если нет хоть каких-то своих идей, тебе в центр помощи
за тебя тут делать ничего не будут

Автор: Earnest 20.8.2007, 09:52
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Ambition 20.8.2007, 09:56
Сори, забыла, что мне в Центр надо было. А программа должна быть написана по теме Наследование!!!!

Автор: Greeen 20.8.2007, 10:08
Ambition, но это же бред будет. Тут наследованием и не пахнет. Имеем структуру "преподаватель" и класс кафедры с вектором этих самых преподавателей. Где тут наследование влепить не представляю.

Автор: Ambition 20.8.2007, 10:13
Вот, я над этим думала. В условии просто задано на эту тему, видимо ты прав. Тогда тему Наследование опустим. Ниписать, не опираясь на нее  smile Спасибо.

Автор: Greeen 20.8.2007, 11:23
Код

#include <iostream>
#include <vector>

using std::string;
using std::cout;
using std::ostream;
using std::vector;

class Teacher
{
private:
    string _post;            // должность
    string _rank;            // звание
    unsigned int _seniority; // стаж
    bool _sex;               // пол: true - мужчина, false - женщина
    bool _mary;              // сем. положение: true - в браке, false - холост
    unsigned int _children;  // кол-во детей

    friend ostream& operator << (ostream& Stream, const Teacher& teacher);

public:
    Teacher() : _post(""), _rank(""), _seniority(0), _sex(false), _mary(false), _children(0) {}

    Teacher(const string& post, const string& rank, unsigned int seniority,
            bool sex, bool mary, unsigned int children) :
    _post(post), _rank(rank), _seniority(seniority), _sex(sex), _mary(mary), _children(children) {}

    bool moreThanOneChild()
    {
        return (_children > 1);
    }

    ~Teacher() {}
};

ostream& operator << (ostream& stream, const Teacher& teacher)
{
    stream << "Должность: " << teacher._post << "\n";
    stream << "Звание: " << teacher._rank << "\n";
    stream << "Стаж: " << teacher._seniority << " лет \n";
    stream << "Пол: " << (teacher._sex ? "м" : "ж") << "\n";
    stream << "Семейное положение: " << (teacher._mary ? "в браке" : "холост") << "\n";
    stream << "Количество детей: " << teacher._children << "\n";
    return stream;
}

class Faculty
{
public:
    void addTeacher(const Teacher& teacher)
    {
        _teachers.push_back(teacher);
    }

    void printTeachers()
    {
        for(vector<Teacher>::iterator i = _teachers.begin(); i != _teachers.end(); i++)
            if(i->moreThanOneChild())
                cout << *i;
    }

private:
    vector<Teacher> _teachers;
};

int main()
{
    Faculty faculty;
    faculty.addTeacher(Teacher("1", "1", 1, true, true, 1));
    faculty.addTeacher(Teacher("2", "2", 2, true, true, 2));
    faculty.printTeachers();
    return 0;
}

Автор: Ambition 20.8.2007, 11:46
Пасибки, буду разбираться


M
Guedda
Модератор: Не забываем отмечать вопрос решенным!

Автор: Arks 20.8.2007, 14:30
Greeen, не подскажите, а где вы в вашем примере использовали наследование?

Автор: Ambition 20.8.2007, 14:35
Arks, Greeen писал, что "наследованием" тут и не пахнет вовсе, поэтому писалась она без него

Автор: sentry 20.8.2007, 14:42
Цитата(Arks @  20.8.2007,  16:00 Найти цитируемый пост)
Greeen, не подскажите, а где вы в вашем примере использовали наследование?

Читаем:

Цитата(Greeen @  20.8.2007,  11:38 Найти цитируемый пост)
бред будет. Тут наследованием и не пахнет

Цитата(Ambition @  20.8.2007,  11:43 Найти цитируемый пост)
Тогда тему Наследование опустим


В данном случае уместна только композиция, но никак не наследование... А вы можете привести пример с наследованием?  smile 

Автор: Arks 20.8.2007, 14:53
В принципе можно.
Раз сказано наследование, значит будет оно:
Можно создать класс кафедра, и от него наследовать три различных её вида, а в каждом добавить какое-нибудь уникальное поле. Бред, конечно, но раз препод требует  smile 

Цитата(Ambition)
Тогда тему Наследование опустим

А вот это я проглядел.  smile 

Автор: Rockie 22.8.2007, 13:13
У нас есть преподаватели. У каждого есть имя и какое-то количество детей. Поэтому преподавателей можно, как уже сказали раньше, оформить в структуру. Нечто вроде 
Код

typedef struct teachers{
string name;
int howMuchChildrens;
}


У нас есть 3 кафедры. Но каждая кафедра имеет общие с другой особенности: у нее есть ЗавКаф(..НифНиф, НафНаф smile ), и группа учителей, когорая на этой кафедре работает. Также нам необходимо реализовать метод, отображающий учителей с несколькими детьми. Его тоже помещаем в класс кафедры и таким образом получаем:
Код

class Cafedra{
protected:
string ZavKaf;
teachers* pArrayOfTeachers;
void DisplayTeachersWithChildren();
};


И далее просто наследуем от класса кафедры класс Экономической кафедры, Управленческой и тд. Таким образом мы получим 3 кафедры с однообразным набором данных, но тем не менее разных(на кафедре экономики можно добавить одни предметы, на другую - другие). Ну и, само собой, по типу указателя можно будет определить, к какой кафедре какой преподаватель относится.


Автор: Ambition 5.9.2007, 17:01
Так может кто начиркает кодик с Наследованием, такое поставили условие  smile 

Автор: apook 5.9.2007, 18:08
Цитата(sentry @  20.8.2007,  09:45 Найти цитируемый пост)
Не понял, где тут наследование? Есть кафедра, есть преподаватель. Но кафедра это не преподаватель, а преподаватель это не кафедра

кафедра это не преподаватель, а вот преподаватель как-раз кафедра!

Автор: Xenon 5.9.2007, 19:55
Наследование-то бывает и делигированием и включением и классическим smile
У Кафежры есть преподователь ... HAS наследование, то есть включением smile

Автор: JackYF 5.9.2007, 22:57
Цитата(Xenon @  5.9.2007,  19:55 Найти цитируемый пост)
HAS наследование, то есть включением smile

не, ну это же не наследование. Если я принес в квартиру комп, то квартира от компа никак не наследуется smile

Автор: apook 5.9.2007, 23:38
Цитата(JackYF @  5.9.2007,  22:57 Найти цитируемый пост)
 Если я принес в квартиру комп, то квартира от компа никак не наследуется 

Но компьютир может стать потомком квартиры.И тогда его комплектующие смогут обращаться ко всему что есть в квартире как к своему имуществу.. ;) 

Автор: JackYF 6.9.2007, 01:48
Цитата(apook @  5.9.2007,  23:38 Найти цитируемый пост)
Но компьютир может стать потомком квартиры.И тогда его комплектующие смогут обращаться ко всему что есть в квартире как к своему имуществу.. ;) 

гы. а если там (в классе Квартира) был private-доступ? тогда фиг ;)

Автор: apook 6.9.2007, 06:44
Цитата(JackYF @  6.9.2007,  01:48 Найти цитируемый пост)
а если там (в классе Квартира) был private-доступ?
ааа конечно ты знал...
а друзья?  будет ли класс-друг считаться потомком?

Автор: JackYF 6.9.2007, 09:29
Цитата(apook @  6.9.2007,  06:44 Найти цитируемый пост)
будет ли класс-друг считаться потомком?

 smile чтоб я рожал своего друга...  smile 

Автор: Fantasist 6.9.2007, 11:10
А че там, наследование всегда можно ввинтить создав общий предок - типа CObject. Объект типа. Ну можно еще повыпендриваться. 
Например

Код


       CObject
            |
      CPrintable  { virtual print(); }
       /          \
      /            ---------------------\
CHuman                                CWorkOrganization 
 sex,                                           workers: list of CHumans   //работники
 age,                                           name
 children,                                      print(); //печатает лист работников через CHuman::print();
 mart_status//одинок или нет                      | 
 print(); // выводит                              | 
    |       //все параметры                       |
    |                                             | 
    |                                             | 
CTeacher                                       CKafedra //если подумать, то можно что нибудь 
 stadge //забыл как "стаж"                              //специально для кафедры придумать 
             //по англиский                             //Например создать в CWorkOrganization 
 print(); //вызывает CHuman::print()                    //виртуальный метод addworker и перекрыть его в
            //и добавляет стаж                          //CKafedra, проверяя, чтобы добавлялись только учителя.



   Так что главное фантазия и широкое мышление, можно вполне что-то разумное сделать. smile

Автор: Rockie 6.9.2007, 13:00
Цитата(JackYF @  5.9.2007,  22:57 Найти цитируемый пост)
 Если я принес в квартиру комп

Квартира и комп - это композиция. Квартира _содержит_ компьютер, но компьютер _не является_ квартирой. "Является ли?" и "Содержит ли?" этих вопросов обычно должно хватать чтобы отделить наследование от композиции.


Автор: sentry 6.9.2007, 15:04
Цитата(apook @  5.9.2007,  19:38 Найти цитируемый пост)
кафедра это не преподаватель, а вот преподаватель как-раз кафедра!

Отличаем наследование от композиции(делегирования), ага? Интересно, как это преподаватель унаследует от кафедры св-ва, присущие только кафедре  smile 

Автор: Xenon 6.9.2007, 15:54
JackYF, ну просто есть абстрактно термин НАСЛЕДОВАНИЕ. Оно бывает разным. Классическое наследование IS A - это, с последующим отношением тип/субтип. А бывает наследование включением - HAS A, когда ты что имеешь. Но все это же общим словом наследованием именуется.

Автор: JackYF 6.9.2007, 16:56
Цитата(Rockie @  6.9.2007,  13:00 Найти цитируемый пост)
Квартира и комп - это композиция. Квартира _содержит_ компьютер, но компьютер _не является_ квартирой. "Является ли?" и "Содержит ли?" этих вопросов обычно должно хватать чтобы отделить наследование от композиции.

Ну дык а я о чем smile

Цитата(Xenon @  6.9.2007,  15:54 Найти цитируемый пост)
Но все это же общим словом наследованием именуется. 

у меня режет язык, мозги и всё что угодно от такой трактовки... можно ссылку, где оно так именуется?

Автор: apook 6.9.2007, 17:11
Цитата(sentry @  6.9.2007,  15:04 Найти цитируемый пост)
 Интересно, как это преподаватель унаследует от кафедры св-ва, присущие только кафедре

Да как раз смысл не важен можно даже не компьютер а дорога причем она-ж не в квартире а ведь будет наследовать напишешь:
Код

class дорога : public квартира

и пошла дорога знать что в квартире есть 

Автор: sentry 6.9.2007, 18:29
Цитата(apook @  6.9.2007,  18:41 Найти цитируемый пост)
Да как раз смысл не важен можно даже не компьютер а дорога причем она-ж не в квартире а ведь будет наследовать напишешь:

Да наследовать-то будет. Только не надо так делать. Нехорошо это  smile 

Цитата(JackYF @  6.9.2007,  18:26 Найти цитируемый пост)
можно ссылку, где оно так именуется?

Вроде Троелсен (правда С#, но это не суть важно).

Автор: Fantasist 6.9.2007, 20:26
Цитата(Xenon @  6.9.2007,  12:54 Найти цитируемый пост)
JackYF, ну просто есть абстрактно термин НАСЛЕДОВАНИЕ. Оно бывает разным. Классическое наследование IS A - это, с последующим отношением тип/субтип. А бывает наследование включением - HAS A, когда ты что имеешь. Но все это же общим словом наследованием именуется. 


  Да ну фигня какая. Выбрось те источники где так именуется. Это так совершенно можно запутаться. Все таки нормально различают наследование и композицию. Наследование - это создание подтипа, композиция - это просто отдельный тип с включенными объектами. И это достадочно разные разные подходы, несмотря на то, что при полном делегированнии включенных объектов по использованию это не будет отличатся от наследования (правда в этом случае, возможно, множественного, что тоже не во всех языках реализуемо). А вообще есть еще термин агрегирование, который по сути мало чем отличим от композиции, в распостранненом понимани, как я понял. Некоторые источники говорят, что при композоции время жизни объектов жестко привязванно, а при агрегации нет.  То есть при композиции главные является хозяином всех включенных объектов, а пре агрегировании они могут добавлятся и убираться от туда свободно. Правда в моей практике, случае везде где я встречал  агрегацию, она совершенно не отличались от композиции. Так что я вообще привык это агрегацией называть.
   Некоторые опять же утверждают, что если объект содержит вектор других объектов, то это тоже агрегация. А по мне так это типичный контейнер. Для меня агрегация так же как и композиция - это отношение один к одному. 
  Короче, терминология и так запутанна, не надо ее еще больше запутывать называя все наследованием. smile

Добавлено через 2 минуты и 42 секунды
О кстати! Глянте сюда: http://en.wikipedia.org/wiki/Composite_pattern#Example

Оказывается тот пример, что я написал предыдущим постингом один в один Composite pattern. smile

Добавлено через 3 минуты и 48 секунд
Вот как много можно сделать из обыкновенной туповатой школьной задачи. smile

Автор: Xenon 7.9.2007, 23:10
Термин "наследование включением" режет слух? У Коплиена вроде так.
Fantasist, разницы между агрегированием, композицией и делигированием в С++, как мне кажется, нет вообще smile Но вообще она есть в других языках.
PS. Ага, а вообще каждый второй класс - это паттерн Декоратор smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)