Наследование

Тема в разделе "Общие вопросы по С и С++", создана пользователем shocoladka, 27 ноя 2011.

  1. shocoladka

    shocoladka Гость

    Добрый лень!
    Я начала писать примерный код программы:разработать и реализовать базовый класс (Base), объединяющий свойства перечисленных классов. Класс Base должен содержать не менее 2 полей и не менее 2 методов. Создать перечисленные классы как производные для базового класса (Base) с различным уровнем доступа, переопределить в них 1 метод базового класса. Объявить и описать собственные методы в производных классах. Продемонстрировать работу классов.
    (студент, преподаватель, заведующий кафедрой.)
    Код (Text):
    # include <iostream>
    using namespace std;
    class Base
    {
    public:
    Base(){}
    ~Base(){}

    string getSurname();
    string getName();
    void setSurname(string value);
    void setName(string value);

    private:
    string name;
    string surname;
    };

    class Student:public Base
    {
    public:
    Student(){cout<<"конструктор Student\n";}
    ~Student(){cout<<"деструктор Student\n";}
    };
    class Teacher:protected Base
    {
    public:
    Teacher(){cout<<"конструктор Teacher\n";}
    ~Teacher(){cout<<"деструктор Teacher\n";}
    };
    class Head:private Base
    {
    public:
    Head(){cout<<"конструктор Head\n";}
    ~Head(){cout<<"деструктор Head\n";}
    };
    Можно узнать правильно ли я начала?И примерно,что дальше делать и как переопределить метод?
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ну во-первых тебе надо в базовом классе описать код функций, думаю можно оставить только get-функции.
    Таким же образом опиши одну из функций в производных классах, с тем же именем, количеством возвращаемых и передаваемых параметров и их типами.
    Например:
    Код (C++):
        class Base {
    string A;
    string B;
    string getA() { return A; }
    string getB() { return B; }
    };

    class A : public Base {
    string A;
    string getA() { return A; } // метод getA() переопределен
    };

    ...
    И дальше по-аналогии.
     
  3. shocoladka

    shocoladka Гость

    Я переписала программу вот так:
    Код (Text):
       
    # include <iostream>
    using namespace std;
    class Base
    {
    protected:
    char * name;
    char * surname;
    int age;
    public:
    Base()
    {
    name=NULL;
    surname=NULL;
    age-0;
    }
    ~Base(){}

    void Print(){}
    void Input(){};
    };

    class Student:public Base
    {
    private:
    int coorse,group;
    int rate;
    public: Student()
    {
    coorse=0;
    group=0;
    rate=0;
    }

    ~Student()
    {
    delete name;
    delete surname;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
    }
    void Input()
    {
    cout<<"Введите имя студента "<<endl;
    cin>>name;
    cout<<"Введите фамилию студента "<<endl;
    cin>>surname;
    cout<<"Введите возраст студента "<<endl;
    cin>>age;
    cout<<"Введите курс студента"<<endl;
    cin>>coorse;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите рейтинг студента"<<endl;
    cin>>rate;
    }
    };
    class Teacher:public Base
    {
    char*post;
    float salary;
    public:
    Teacher()
    {
    post=NULL;
    salary=0;
    }
    ~Teacher()
    {
    delete name;
    delete surname;
    delete post;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
    }
    void Input()
    {
    cout<<"Введите имя преподавателя "<<endl;
    cin>>name;
    cout<<"Введите фамилию преподавателя "<<endl;
    cin>>surname;
    cout<<"Введите возраст преподавателя "<<endl;
    cin>>age;
    cout<<"Введите должность преподавателя "<<endl;
    cin>>post;
    cout<<"Введите зарплату преподавателя"<<endl;
    cin>>salary;

    };
    class Head:public Base
    {
    char*chair;


    public:
    Head()
    {
    chair=NULL;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<chair<<endl;
    }
    void Input()
    {
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    cout<<"Введите возраст заведующего кафедрой "<<endl;
    cin>>age;
    cout<<"Введите кафедру заведующего "<<endl;
    cin>>chair;
    {
    delete name;
    delete surname;
    delete chair;
    }

    };
    void main()
    Только теперь не знаю что описывать в главной функции..
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Зачем ты столько нагородила? Ошибок тьма. Сократи до минимума, зачем тебе делать больше чем указано в задании!?
     
  5. shocoladka

    shocoladka Гость

    А что именно я ни так сделала?Я не понимаю...
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    не вникал, но:
    Код (Text):
        cin>>chair;
    {
    delete name;
    delete surname;
    delete chair;
    }
    зачем эти фигурные скобки?

    Добавлено: и чтобы в каждом наследнике не освобождать память из под полей суперкласса используй виртуальный деструктор

    Добавлено:
    Код (Text):
    Base()
    {
    name=NULL;
    surname=NULL;
    не нашел где память по указателям выделяется, но они используются:
    Код (Text):
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    Добавлено:
    Код (Text):
    Base()
    {
    name=NULL;
    surname=NULL;
    age-0;
    }
    что-то неведомое делаем с age
     
  7. shocoladka

    shocoladka Гость

    Код (Text):
    # include <iostream>
    using namespace std;
    class Base
    {
    protected:
    char * name;
    char * surname;
    int age;
    public:
    Base()
    {
    name=NULL;
    surname=NULL;
    age=0;
    }
    ~Base(){}

    void Print(){}
    void Input(){};
    };

    class Student:public Base
    {
    private:
    int coorse,group;
    int rate;
    public: Student()
    {
    coorse=0;
    group=0;
    rate=0;
    }

    ~Student()
    {
    delete name;
    delete surname;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
    }
    void Input()
    {
    cout<<"Введите имя студента "<<endl;
    cin>>name;
    cout<<"Введите фамилию студента "<<endl;
    cin>>surname;
    cout<<"Введите возраст студента "<<endl;
    cin>>age;
    cout<<"Введите курс студента"<<endl;
    cin>>coorse;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите рейтинг студента"<<endl;
    cin>>rate;
    }
    };
    class Teacher:public Base
    {
    char*post;
    float salary;
    public:
    Teacher()
    {
    post=NULL;
    salary=0;
    }
    ~Teacher()
    {
    delete name;
    delete surname;
    delete post;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
    }
    void Input()
    {
    cout<<"Введите имя преподавателя "<<endl;
    cin>>name;
    cout<<"Введите фамилию преподавателя "<<endl;
    cin>>surname;
    cout<<"Введите возраст преподавателя "<<endl;
    cin>>age;
    cout<<"Введите должность преподавателя "<<endl;
    cin>>post;
    cout<<"Введите зарплату преподавателя"<<endl;
    cin>>salary;

    };
    class Head:public Base
    {
    char*chair;


    public:
    Head()
    {
    chair=NULL;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<chair<<endl;
    }
    void Input()
    {
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    cout<<"Введите возраст заведующего кафедрой "<<endl;
    cin>>age;
    cout<<"Введите кафедру заведующего "<<endl;
    cin>>chair;
    }
    ~ Head()
    {
    delete name;
    delete surname;
    delete chair;
    }

    };
    void main()
    Вот так..
     
  8. shocoladka

    shocoladka Гость

    Код (Text):
    # include <iostream>
    using namespace std;
    class Base
    {
    protected:
    char * name;
    char * surname;
    int age;
    public:
    Base()
    {
    surname=new char [20];
    name=new char [20];
    age=0;
    }
    ~Base()
    {
    delete name;
    delete surname;
    }

    void Print()
    {
    cout<<name<<" "<<surname<<"\n возвраст:"<<age<<endl;
    }
    void Input()
    {
    cout<<"введите фамилию, имя"<<endl;
    cin>>surname>>name;
    cout<<"введите возраст"<<endl;
    cin>>age;
    }
    };
    class Student:public Base
    {
    private:
    int coorse,group;
    int rate;
    public:
    Student()
    {
    coorse=0;
    group=0;
    rate=0;
    }

    ~Student()
    {
    delete name;
    delete surname;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
    }
    void Input()
    {
    cout<<"Введите имя студента "<<endl;
    cin>>name;
    cout<<"Введите фамилию студента "<<endl;
    cin>>surname;
    cout<<"Введите возраст студента "<<endl;
    cin>>age;
    cout<<"Введите курс студента"<<endl;
    cin>>coorse;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите рейтинг студента"<<endl;
    cin>>rate;
    }
    };
    class Teacher:protected Base
    {
    char*post;
    float salary;
    public:
    Teacher()
    {
    post=new char [20];
    salary=0;
    }
    ~Teacher()
    {
    delete name;
    delete surname;
    delete post;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
    }
    void Input()
    {
    cout<<"Введите имя преподавателя "<<endl;
    cin>>name;
    cout<<"Введите фамилию преподавателя "<<endl;
    cin>>surname;
    cout<<"Введите возраст преподавателя "<<endl;
    cin>>age;
    cout<<"Введите должность преподавателя "<<endl;
    cin>>post;
    cout<<"Введите зарплату преподавателя"<<endl;
    cin>>salary;
    }
    };
    class Head:private Base
    {
    char*chair;
    public:
    Head()
    {
    chair = new char [20];
    }
    ~Head()
    {
    delete name;
    delete surname;
    delete chair;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<chair<<endl;
    cout<<"возраст"<<age<<endl;
    }
    void Input()
    {
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    cout<<"Введите кафедру заведующего "<<endl;
    cin>>chair;
    cout<<"Введите возраст заведующего кафедрой "<<endl;
    cin>>age;
    }
    };
    void main()
    {
    setlocale(LC_ALL, "Russian");
    Base *a=new Base();
    a->Input();
    a->Print();
    Student *b= new Student();
    b->Input();
    b->Print();
    Teacher *c= new Teacher();
    c->Input();
    c->Print();
    Head *d= new Head ();
    d->Input();
    d->Print();
    system("pause");
    }
    Не могли б вы объяснить что значат вот эти строки в конструкторе:
    Код (Text):
    Base()
    {
    surname=new char [20];
    name=new char [20];
    age=0;
    }
    зачем в деструкторе освобождать память:
    Код (Text):
    ~Base()
    {
    delete name;
    delete surname;
    }
    Почему мы объявляем указатель:
    Код (Text):
            char * name;
    char * surname;
    Зачем в главной функции выделяем память:
    Код (Text):
    Base *a=new Base();
     
  9. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    1. Выделение памяти.
    2. Выделение памяти.
    3. Присвоение значения.

    Ну как зачем?! Допустим. Представь такую ситуацию: ты взяла у меня в долг 10000 рублей, если ты мне их не отдашь, то это будет не по-человечески! Долги надо возвращать! Так же и память, которую ты взяла в конструкторе.

    Потому что в переменную типа char ты можешь записать только один символ, а указателю можно присвоить адрес строки произвольной длины в памяти компьютера.

    Не знаю. Кому как нравится. Можно обойтись и без этого, например вот так:
    Код (C++):
        ...
    Base    a;
    a.Input();
    ...
    a.Print();
    ...
    А вообще, учи матчасть!
     
  10. shocoladka

    shocoladka Гость

    Добрый лень!
    Я написала код программы:разработать и реализовать базовый класс (Base), объединяющий свойства перечисленных классов. Класс Base должен содержать не менее 2 полей и не менее 2 методов. Создать перечисленные классы как производные для базового класса (Base) с различным уровнем доступа, переопределить в них 1 метод базового класса. Объявить и описать собственные методы в производных классах. Продемонстрировать работу классов.
    (студент, преподаватель, заведующий кафедрой.)Теперь необходимо сделать функции виртуальными и создать стек..
    Код (Text):
    # include <iostream>
    using namespace std;
    class Base
    {
    protected:
    char * name;
    char * surname;
    int age;
    public:
    Base()
    {
    surname=new char [20];
    name=new char [20];
    age=0;
    }

    ~Base()
    {
    delete name;
    delete surname;
    }

    void Print()
    {
    cout<<name<<" "<<surname<<"\n возвраст:"<<age<<endl;
    }
    void Input()
    {
    cout<<"введите фамилию, имя"<<endl;
    cin>>surname>>name;
    cout<<"введите возраст"<<endl;
    cin>>age;
    }
    };
    class Student:public Base
    {
    private:
    int coorse,group;
    int rate;
    public:
    Student()
    {
    coorse=0;
    group=0;
    rate=0;
    }

    ~Student()
    {
    delete name;
    delete surname;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
    }
    void Input()
    {
    cout<<"Введите имя студента "<<endl;
    cin>>name;
    cout<<"Введите фамилию студента "<<endl;
    cin>>surname;
    cout<<"Введите возраст студента "<<endl;
    cin>>age;
    cout<<"Введите курс студента"<<endl;
    cin>>coorse;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите рейтинг студента"<<endl;
    cin>>rate;
    }
    };
    class Teacher:protected Base
    {
    char*post;
    float salary;
    public:
    Teacher()
    {
    post=new char [20];
    salary=0;
    }
    ~Teacher()
    {
    delete name;
    delete surname;
    delete post;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
    }
    void Input()
    {
    cout<<"Введите имя преподавателя: "<<endl;
    cin>>name;
    cout<<"Введите фамилию преподавателя: "<<endl;
    cin>>surname;
    cout<<"Введите возраст преподавателя: "<<endl;
    cin>>age;
    cout<<"Введите должность преподавателя: "<<endl;
    cin>>post;
    cout<<"Введите зарплату преподавателя:"<<endl;
    cin>>salary;
    }
    };
    class Head:private Base
    {
    char*chair;
    public:
    Head()
    {
    chair = new char [20];
    }
    ~Head()
    {
    delete name;
    delete surname;
    delete chair;
    }
    void Print()
    {
    cout<<name<<","<<surname<<","<<chair<<endl;
    cout<<"возраст"<<age<<endl;
    }
    void Input()
    {
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    cout<<"Введите кафедру заведующего "<<endl;
    cin>>chair;
    cout<<"Введите возраст заведующего кафедрой "<<endl;
    cin>>age;
    }
    };

    void main()
    {
    setlocale(LC_ALL, "Russian");
    Base *a=new Base();
    a->Input();
    a->Print();
    Student *b= new Student();
    b->Input();
    b->Print();
    Teacher *c= new Teacher();
    c->Input();
    c->Print();
    Head *d= new Head ();
    d->Input();
    d->Print();
    system("pause");
    }
     
Загрузка...
Похожие Темы - Наследование
  1. Dragon108
    Ответов:
    23
    Просмотров:
    5.531
  2. vladis222
    Ответов:
    4
    Просмотров:
    1.621
  3. vladis222
    Ответов:
    4
    Просмотров:
    1.926
  4. Stashevckiy
    Ответов:
    10
    Просмотров:
    3.161
  5. olimp72
    Ответов:
    2
    Просмотров:
    2.437

Поделиться этой страницей