Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для vladis23
13 / 13 / 10
Регистрация: 25.05.2015
Сообщений: 554

Абстрактный класс в С++

01.05.2016, 00:22. Показов 2173. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте)
Начаю изучать классы, можете мне показать абстрактные класс с перегруженным конструктором и наследованием. Например класс абстрактный Персона с полями фамилие, имя, год рождения и его 2 производных класса:
Школьник с полями - фамилие, имя, год рождения, класс.
Выпускник с полями - фамилие, имя, год рождения, средний балл.
Буду очень благодарен за пример
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2016, 00:22
Ответы с готовыми решениями:

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Создать иерархию классов Figure
Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle...

Абстрактный класс, наследование, класс хранится в другом классе
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

10
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
01.05.2016, 00:51
Ты что-то подобное хотел? Не знаю зачем классу Person поля эти твои и конструкторы, но вот, как заказывал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <string>
 
class Person {
private:
    std::string name;
    std::string last_name;
    int year_born;
 
public:
    Person() {}
 
    Person(std::string name, std::string last_name, int year_born)
        : name(name), last_name(last_name), year_born(year_born) {}
 
    Person(const Person& other)
    {
        name = other.name;
        last_name = other.last_name;
        year_born = other.year_born;
    }
 
    virtual void getData() = 0;  
    virtual void showData() = 0; 
};
 
class Pupil : public Person {
private:
    std::string name;
    std::string last_name;
    int year_born;
    int grade;
 
public:
 
    void getData()
    {
        std::cout << "Введите имя: "; std::cin >> name;
        std::cout << "Введите фамилию: "; std::cin >> last_name;
        std::cout << "Введите год рождения: "; std::cin >> year_born;
        std::cout << "Введите класс: "; std::cin >> grade;
    }
 
    void showData()
    {
        std::cout << "Имя: " << name << "\n";
        std::cout << "Фамилия: " << last_name << "\n";
        std::cout << "Год рождения: " << year_born << "\n";
        std::cout << "Класс: " << grade << "\n";
    }
 
};
 
class Student : public Person {
private:
    std::string name;
    std::string last_name;
    int year_born;
    int average;
 
public:
 
    void getData()
    {
        std::cout << "Введите имя: "; std::cin >> name;
        std::cout << "Введите фамилию: "; std::cin >> last_name;
        std::cout << "Введите год рождения: "; std::cin >> year_born;
        std::cout << "Введите средний балл: "; std::cin >> average;
    }
 
    void showData()
    {
        std::cout << "Имя: " << name << "\n";
        std::cout << "Фамилия: " << last_name << "\n";
        std::cout << "Год рождения: " << year_born << "\n";
        std::cout << "Ср. балл: " << average << "\n";
    }
 
};
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
01.05.2016, 02:36
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <string>
#include <iostream>
 
using namespace std;
 
class AbstractPerson{  //<---- Абстрактный класс
protected:
    string FirstName; //<--- Это унаследуется
    string LastName;
    string DR;
};
 
class PersonSchoolman:AbstractPerson{   //<--- Наследуемся от абстрактного класса
public:
 
    PersonSchoolman(string FirstName_){     //<--- Конструкторы, их несколько.
        FirstName = FirstName_;
    };
    PersonSchoolman(string FirstName_, string LastName_){ //<---- Они отличаются принимаемыми параметрами = перегрузка
        FirstName = FirstName_;
        LastName = LastName_;
    };
    PersonSchoolman(string FirstName_, string LastName_,string DR_){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
    };
 
    void Show_Info(){
        cout << FirstName << "    " << LastName << "     " << DR << '\n';
    }
};
 
class PersonGraduate:AbstractPerson{
    int MiddleBall;
public:
 
    PersonGraduate(string FirstName_):MiddleBall(0){     //<--- Конструкторы, их несколько.
        FirstName = FirstName_;
    };
 
    PersonGraduate(string FirstName_, string LastName_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
    };
 
    PersonGraduate(string FirstName_, string LastName_,string DR_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
    };
 
    PersonGraduate(string FirstName_, string LastName_,string DR_, int MiddleBall_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
        MiddleBall = MiddleBall_;
    };
 
    void Show_Info(){
        cout << FirstName << "    " << LastName << "    " << DR << "    ";
        if (MiddleBall) cout <<  MiddleBall;
        cout << '\n';
    }
};
 
int main() {
 
 
    cout << "\n\nSCHOOLMANS:\n";
    PersonSchoolman schoolman1("WASA"); // <---- Боагодаря перегруженным конструкторам, параметры можно отдавать по разному
    PersonSchoolman schoolman2("PETR","IVANOV");
    PersonSchoolman schoolman3("SERGEY","ALEKSEEV", "1982");
 
    schoolman3.Show_Info();
    schoolman2.Show_Info();
    schoolman1.Show_Info();
 
    //По аналогии
    cout << "\n\nGRADUATES:\n";
    PersonGraduate graduate1("ANDREY");
    PersonGraduate graduate2("GENADIY","JAKOVLEW");
    PersonGraduate graduate3("PAVEL","ALEKSEEV", "1966");
    PersonGraduate graduate4("KOSTIA", "KRIVCOW", "1977", 4);
 
 
    graduate4.Show_Info();
    graduate3.Show_Info();
    graduate2.Show_Info();
    graduate1.Show_Info();   
}
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
01.05.2016, 03:15
daslex, ваш класс не является абстарктным т.к свободно можно создать его объект, хоть и нельзя получить доступ к полям, это пример логически абстартного класса
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
01.05.2016, 03:30
Цитата Сообщение от obivan Посмотреть сообщение
daslex, ваш класс не является абстарктным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <string>
#include <iostream>
 
using namespace std;
 
class AbstractPerson{  //<---- Абстрактный класс
protected:
    string FirstName; //<--- Это унаследуется
    string LastName;
    string DR;
public:
   virtual void Show_Info ( void ) = 0;
};
 
class PersonSchoolman:AbstractPerson{   //<--- Наследуемся от абстрактного класса
public:
 
    PersonSchoolman(string FirstName_){     //<--- Конструкторы, их несколько.
        FirstName = FirstName_;
    };
    PersonSchoolman(string FirstName_, string LastName_){ //<---- Они отличаются принимаемыми параметрами = перегрузка
        FirstName = FirstName_;
        LastName = LastName_;
    };
    PersonSchoolman(string FirstName_, string LastName_,string DR_){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
    };
 
    void Show_Info(){
        cout << FirstName << "    " << LastName << "     " << DR << '\n';
    }
};
 
class PersonGraduate:AbstractPerson{
    int MiddleBall;
public:
 
    PersonGraduate(string FirstName_):MiddleBall(0){     //<--- Конструкторы, их несколько.
        FirstName = FirstName_;
    };
 
    PersonGraduate(string FirstName_, string LastName_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
    };
 
    PersonGraduate(string FirstName_, string LastName_,string DR_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
    };
 
    PersonGraduate(string FirstName_, string LastName_,string DR_, int MiddleBall_):MiddleBall(0){
        FirstName = FirstName_;
        LastName = LastName_;
        DR = DR_;
        MiddleBall = MiddleBall_;
    };
 
    void Show_Info(){
        cout << FirstName << "    " << LastName << "    " << DR << "    ";
        if (MiddleBall) cout <<  MiddleBall;
        cout << '\n';
    }
};
 
int main() {
 
 
    cout << "\n\nSCHOOLMANS:\n";
    PersonSchoolman schoolman1 ("WASA"); // <---- Боагодаря перегруженным конструкторам, параметры можно отдавать по разному
    PersonSchoolman schoolman2("PETR","IVANOV");
    PersonSchoolman schoolman3("SERGEY","ALEKSEEV", "1982");
 
    schoolman3.Show_Info();
    schoolman2.Show_Info();
    schoolman1.Show_Info();
 
    //По аналогии
    cout << "\n\nGRADUATES:\n";
    PersonGraduate graduate1("ANDREY");
    PersonGraduate graduate2("GENADIY","JAKOVLEW");
    PersonGraduate graduate3("PAVEL","ALEKSEEV", "1966");
    PersonGraduate graduate4("KOSTIA", "KRIVCOW", "1977", 4);
 
 
    graduate4.Show_Info();
    graduate3.Show_Info();
    graduate2.Show_Info();
    graduate1.Show_Info();
 
}
0
01.05.2016, 03:31

Не по теме:

daslex, теперь нет возражений ;)

0
 Аватар для vladis23
13 / 13 / 10
Регистрация: 25.05.2015
Сообщений: 554
01.05.2016, 23:18  [ТС]
C++
1
virtual void Show_Info ( void ) = 0;
Можете объяснить что значит эта строка в классе AbstractPerson?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.05.2016, 23:33
Цитата Сообщение от vladis23 Посмотреть сообщение
Можете объяснить что значит эта строка в классе AbstractPerson?
"чистая виртуальная функция".
подробности расскажет гугл.
0
 Аватар для vladis23
13 / 13 / 10
Регистрация: 25.05.2015
Сообщений: 554
01.05.2016, 23:42  [ТС]
hoggy, От этой функции перегружается в производном его класса?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.05.2016, 00:20
vladis23,
На языке программирования C++ абстрактный класс объявляется включением хотя бы одной чистой виртуальной функции, типа virtual _сигнатура_функции_ =0;, которая, как и другие, может быть заменена. Пример на языке программирования C++:
ист. https://ru.wikipedia.org/wiki/... 1%81%D1%81 см.С++

Добавлено через 2 минуты
Виртуальные и чисто виртуальные функции
0
 Аватар для vladis23
13 / 13 / 10
Регистрация: 25.05.2015
Сообщений: 554
02.05.2016, 11:31  [ТС]
Можете подсказать что не так с моим кодом, при удачной компиляции выводит ошибку
Вот сам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;
typedef unsigned short word;
class AbstractPerson{
public:
    string FSurname;
  string FName;
  word DR;
  AbstractPerson(){}
    AbstractPerson(string FSurname_, string FName_,word DR_)
    {
      FSurname = FSurname_;
      FName = FName_;
      DR = DR_;
      }
protected:
    virtual void getData()=0;
    virtual void showData()=0;
};
class SchoolMan:public AbstractPerson
{
  private:
    word Fclass;
  public:
    SchoolMan(string FSurname_,string FName_,word DR_,word Fclass_):AbstractPerson(FSurname,FName,DR)
    {Fclass = Fclass_;}
    void getData()
    { cout<<"Введите фамилию: "; cin>>FSurname;
       cout<<"Введите имя: "; cin>>FName;
       cout<<"Введите год рожденья: "; cin>>DR;
      cout<<"Введите класс: "; cin>>Fclass;
    }
    void showData()
    {
       cout<<"Фамилия: "<<FSurname<<endl;
       cout<<"Имя: "<<FName<<endl;
       cout<<"Год рожденья: "<<DR<<endl;
       cout<<"Класс: "<<Fclass<<endl;
    }
};
 
class PersonGraduate:public AbstractPerson
{
private:
    double AverageScore;
    public:
    PersonGraduate(string FSurname_,string FName_,word DR_,double AverageScore_):AbstractPerson(FSurname,FName,DR)
    {
        AverageScore = AverageScore_;
    }
    void getData()
    {
      cout<<"Введите фамилию: "; cin>>FSurname;
       cout<<"Введите имя: "; cin>>FName;
       cout<<"Введите год рожденья: "; cin>>DR;
      cout<<"Введите средний бал аттестата: "; cin>>AverageScore;
    }
    void showData()
    {
     cout<<"Фамилия: "<<FSurname<<endl;
       cout<<"Имя: "<<FName<<endl;
       cout<<"Год рожденья: "<<DR<<endl;
       cout<<"Ср. балл: "<<AverageScore<<endl;
    }
};
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
   SchoolMan schoolboy("Иванов","Иван",1999,7);
  // schoolboy.getData();
   schoolboy.showData();
   return 0;
}
Добавлено через 9 минут
Я разобрался, перепутал поля с параметрами конструктора при наследовании
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.05.2016, 11:31
Помогаю со студенческими работами здесь

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Абстрактный класс/Класс интерфейс
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету реализации. Ну интерфейс задает набор...

Создать класс - данные - абстрактный базовый класс. Создать производные классы
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

Абстрактный класс
Ребят такая проблема, точнее недопонимания. Реализую графический редактор. Есть базовый абстрактный класс GraphObject От него...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru