Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2020, 01:46   #1
fahab51
Новичок
Джуниор
 
Регистрация: 07.12.2020
Сообщений: 3
По умолчанию Наследование и абстрактные базы класс

1. Подготовить класс Person, в котором name, surname это string, age это int. Пускай это будут приватные поля. Поместить заголовок в файле .h б а реализацию в .cpp . Подготовить конструктор по умолчанию который дает имя John, фамилию Smith, возраст 18. Написать метод void display() выводящий информацию о личности.

Подготовить параметризованный конструктор в котром находятся эти три поля. Реализовать его так, что бы он выглядел примерно в следующий способ:
Код:
Person::Person(string name, string surname, int age) :name(name), surname(surname), age(age) {}
2. Попробуем использовать этот механизм для содания класса Student. Student это человек, так что нужно подготовить класс, производный от Student, наследующий от базового класса Person.
Допишем до класса студент поля identificationNumber со string и faculty тоже string. Пускай это будут приватные поля.


Приготовить реализацию деструкторов в базовом и производном классе с проверкой.
Попробуйте приготовить метод void getInformation() которая выведет всю информацию о студенте. Выглядит примерно так
Код:
voidStudent::getInformation() {     cout << name << endl; }
Можете помочь с деструкторами?


main.cpp
Код:
//#include <iostream>
#include "Person.h"
//using namespace std;
int main() {
    Person p1;
    p1.display();
 
    return 0;
 
}
Person.cpp
Код:
#include "Person.h"
 
Person::Person()
{
    this->name = "John";
    this->surname = "Smith";
    this->age = 18;
}
 
Person::Person(string name, string surname, int age): name(name), surname(surname), age(age)
{
 
}
void Person::display()
{
    cout << "student " << name << surname << "in " << age << " age" << endl;
}

Person.h
Код:
#include <cstdlib>
#include <stdio.h>
#include <string>
#include <iostream>
 
using namespace std;
 
class Person
{
private:
    string name, surname;
    int age;
public:
    Person();
    void display();
    Person(string name, string surname, int age);
};

Student.cpp
Код:
#include "Student.h"
 
Student::Student(string name, string surname, int age,
    string identificationNumber, string faculty) :Person(name, surname, age)
{
    this->identificationNumber = identificationNumber;
    this->faculty = faculty;
}

Student.h
Код:
#pragma once
#include "Person.h"
class Student :Person
{
private:
    string identificationNumber;
    string faculty;
public:
    Student(string name, string surname, int age, 
        string identificationNumber, string faculty);
};

Последний раз редактировалось fahab51; 07.12.2020 в 02:01.
fahab51 вне форума Ответить с цитированием
Старый 07.12.2020, 13:40   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

fahab51, динамического выделения памяти вроде не вижу, деструкторы по умолчанию сойдут

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

Код:
class Person
{
....
....
public:
    virtual ~Person()=default;
};
Алексей1153 вне форума Ответить с цитированием
Старый 08.12.2020, 01:55   #3
fahab51
Новичок
Джуниор
 
Регистрация: 07.12.2020
Сообщений: 3
По умолчанию

Алексей1153, Спасибо, вообще да, вы правы, в следующем пункте они говорят использовать виртуальный деструктор: Приготовить в классах Student и Person деструкторы(виртуальные), пускай они выписывают информацию "Destrucor class Person", "Destructor class Student".
Вот небольшой набросок, но не знаю будет ли он работать
Код:
Person *persons[3]; 
persons[0] = newStudent("John", "Nowak", 13, "111", "FMI");     
persons[1] = newStudent("John", "Kowalski", 13, "111", "FMI");     
persons[2] = newStudent("John", "Smith", 13, "111", "FMI"); 
 
for (int i = 0; i < 3; i++)
{
 delete persons[i];
}
fahab51 вне форума Ответить с цитированием
Старый 08.12.2020, 07:32   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

fahab51, вполне себе будет. Вот упрощённый пример

Код:
#include <iostream>

using std::cin;
using std::cout;

class Person
{
public:
    virtual ~Person()
    {
        cout<<"~Person()"<<'\n';
    }
};

class Student :public Person
{
public:
    ~Student()override
    {
        cout<<".."<<"~Student()"<<'\n';
    }
};

class Security :public Student
{
public:
    ~Security()override
    {
        cout<<".."<<"~Security()"<<'\n';
    }
};


int main()
{
    Person* persons[]
    {
        new Person(),
        new Student(),
        new Security(),
    };
     
    for(auto*& p:persons)
    {
        delete p;
        p=nullptr;
    }

    return 0;
}
Цитата:
~Person()
..~Student()
~Person()
..~Security()
..~Student()
~Person()
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование: класс для нахождения площади фигуры, ограниченной прямыми на плоскости romaust C# (си шарп) 0 04.05.2016 10:50
Нужно сделать наследование классов, 1 класс находится первой форме, 2 класс во второй. Вероника99 Помощь студентам 3 29.04.2016 23:02
результат базовый класс и наследование Пепел Феникса Общие вопросы C/C++ 1 21.09.2010 02:29
Класс, наследование nazavrik Общие вопросы C/C++ 8 29.01.2010 16:25
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49