Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331

Указатель на базовый класс

09.10.2018, 13:57. Показов 8379. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте, как под указатель поместить объект производного класса? ( Выдаёт ошибку ).

Задание:
Создать указатель на базовый класс. Под указатель поместить объект про-
изводного класса. Проиллюстрировать работу программы с объектом через указатель
— ввод/вывод данных, вызов функций класса.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
 
using namespace std;
 
class Human {
private:
    string Surname;
    unsigned short int Age;
    string Pol;
public:
Human () {
    Surname = "Белявцев";
    Age = 19;
    Pol = "Мужской";
}
 
Human (string date_Surname, unsigned short int date_Age, string date_Pol) {
Surname = date_Surname;
Age = date_Age;
Pol = date_Pol;
}
 
void input_info () {
    cout << "Введите фамилию и Инициалы(слитно): " << endl;
    cin >> Surname;
    cout << "Введите возраст: " << endl;
    cin >> Age;
    cout << "Введите пол: " << endl;
    cin >> Pol;
}
 
virtual void print_info () {
cout << Surname << ", Возраст: " << Age << ", Пол: " << Pol << ", ";
}
 
~Human() {}
 
};
 
class Student : public Human {
    private:
        unsigned short int Kurs, Number, Medium_mark;
    public:
        Student () {
Kurs = 2;
Number = 12745;
Medium_mark = 5;
        }
 
Student (unsigned short int date_Kurs, unsigned short int date_Number, unsigned short int Medium_mark) {
Kurs = date_Kurs;
Number = date_Number;
Medium_mark = Medium_mark;
}
 
        void input_info() {
cout << "Введите курс на котором обучается студент: " << endl;
    cin >> Kurs;
    cout << "Введите номер зачётки: " << endl;
    cin >> Number;
    cout << "Средняя оценка студента: " << endl;
    cin >> Medium_mark;
        }
 
        virtual void print_info () {
cout << "Обучается на: " << Kurs << " курсе" << ", Номер зачётки: " << Number << ", ";
}
 
        void Excellent () {
            if (Medium_mark == 5) {
cout << "Средняя оценка: " << Medium_mark;
            }
            else {
                cout << "Не отличник - средняя оценка " << Medium_mark;
            }
        }
        
        ~Student () {}
 
    };
 
    class count_pol : public Human {
        private:
        int count_pol_man, count_pol_woman;
        public:
        virtual void print_count () = 0;
    };
 
int main(int argc, char const *argv[])
{
    system("chcp 1251");
 
Human objHuman("Белявцев", 19, "Мужчина");
objHuman.input_info();
 
Student objStudent(2, 12345, 4);
objStudent.input_info();
 
objHuman.print_info();
objStudent.print_info();
objStudent.Excellent();
 
Human *pHuman;
pHuman = new count_pol;
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2018, 13:57
Ответы с готовыми решениями:

Указатель на базовый класс
Есть базовый класс и два производных. Так же имеется очередь, в которой хранится как указатели набазовый класс, так и на его наследники. ...

Указатель на базовый класс и на производный
Пытаюсь разобраться с классами и наследованием. Сама эта задача из Дейтела &quot;Как программировать на C++&quot; Есть базовый класс...

Иерархия классов и указатель на базовый класс
Существует три класса, один наследуется от другого: class Base { public: virtual int WhoAmI const { return 0; }

11
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.10.2018, 14:02
Цитата Сообщение от koks_ikkkk Посмотреть сообщение
Под указатель поместить объект про-
изводного класса. Проиллюстрировать работу программы с объектом через указатель
— ввод/вывод данных, вызов функций класса.
для этого в базовом классе должны быть виртуальные методы, а в производном классе нужно эти методы перегрузить.
0
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
09.10.2018, 14:09  [ТС]
что значит перегрузить?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
09.10.2018, 14:12
Лучший ответ Сообщение было отмечено koks_ikkkk как решение

Решение

koks_ikkkk, это значит, что функция имеет то же самое имя, но либо другое количество параметров, либо другой тип параметров, либо и то, и другое:
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
#include <iostream>
 
class Parent
{
public:
    void show() const
    {
        std::cout << "I am parent!\n";
    }
};
 
class Child : public Parent
{
public:
    void show(char tailing_character) const
    {
        std::cout << "I am Child!" << tailing_character;
    }
};
 
int main()
{
    Parent p;
    p.show();
    Child ch;
    ch.show('\n');
}
1
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
09.10.2018, 14:20  [ТС]
А если у меня несколько производных классов, в задании не понятно, какого производного класса нужно поместить объект, который я создал count_pol или Student? Я так понимаю для coutn_pol этого сделать нельзя, так как там чисто виртуальный метод. Объясните пожалуйста

Полное задание:

3.4.1 Переопределить базовый класс как абстрактный — для этого определить
заданную вариантом функцию как чисто виртуальную. В обязательном порядке
переопределить эту функцию в производном классе.
3.4.2 Дополнительно определить еще один производный класс со своими уни-
кальными полями, переопределить в нем чисто виртуальный метод.
3.4.3 Создать указатель на базовый класс. Под указатель поместить объект про-
изводного класса. Проиллюстрировать работу программы с объектом через указатель
— ввод/вывод данных, вызов функций класса.
3.4.4 Проиллюстрировать корректную работу механизма виртуальных функций
— вызвать виртуальную функцию и убедиться, что тип выполняемой функции соот-
ветствует типу объекта под указателем. Поменять объект под указателем на объект
второго производного класса. Проверить корректную работу механизма.
3.4.5 Описать деструкторы классов, содержащие тестовые фразы для вывода на
экран. Отследить во время выполнения программы работу деструкторов по тестовым
фразам — место вызова, порядок выполнения. Определить работу деструкторов с
использованием виртуальных методов. Отследить изменения в работе программы.
Все выполненные действия отобразить в отчете с пояснениями.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.10.2018, 14:21
koks_ikkkk,
Цитата Сообщение от _stanislav Посмотреть сообщение
а в производном классе нужно эти методы перегрузить.
поправка, не перегрузить, а переопределить.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
09.10.2018, 14:31
Цитата Сообщение от _stanislav Посмотреть сообщение
переопределить
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
#include <iostream>
 
class Mammal
{
public:
    virtual void sound() const = 0;
};
 
class Cat : public Mammal
{
public:
    void sound() const
    {
        std::cout << "meow!\n";
    }
};
 
class Dog : public Mammal
{
public:
    void sound() const
    {
        std::cout << "woof\n";
    }
};
 
int main()
{
    Cat c;
    c.sound();
    Dog d;
    d.sound();
}
2
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
09.10.2018, 15:13  [ТС]
А почему вы вместо одной строчки using namespace std; пишите везде std:: ?

Добавлено через 1 минуту
И почему после методов вы пишите const?

Добавлено через 6 минут
А если у меня в базовом классе несколько методов, они должны быть все виртуальные или только те, которые мне необходимы?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.10.2018, 15:19
Лучший ответ Сообщение было отмечено koks_ikkkk как решение

Решение

Цитата Сообщение от koks_ikkkk Посмотреть сообщение
И почему после методов вы пишите const?
потому что этот метод не меняет поля класса, т.е. эти методы можно вызывать для константных объектов.

Добавлено через 3 минуты
Цитата Сообщение от koks_ikkkk Посмотреть сообщение
А если у меня в базовом классе несколько методов, они должны быть все виртуальные или только те, которые мне необходимы?
только те которые необходимо переопределить в производном классе, т.е. если у производного класса метод должен делать другое действие нежели у базового.

Добавлено через 1 минуту
Цитата Сообщение от koks_ikkkk Посмотреть сообщение
А почему вы вместо одной строчки using namespace std; пишите везде std:: ?
что бы избежать конфликта имен.
1
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
09.10.2018, 20:21  [ТС]
Расскажите пожалуйста о конфликтах имён.

И я создаю указатель на базовый класс, но не знаю как под указатель поместить объект производного класса prof. Как это сделать?

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
 
using namespace std;
 
class Human {
private:
    string Surname;
    unsigned short int Age;
    string Pol;
public:
Human () {
    Surname = "Белявцев";
    Age = 19;
    Pol = "Мужской";
}
 
Human (string date_Surname, unsigned short int date_Age, string date_Pol) {
Surname = date_Surname;
Age = date_Age;
Pol = date_Pol;
}
 
void input_info () {
    cout << "Введите фамилию и Инициалы(слитно): " << endl;
    cin >> Surname;
    cout << "Введите возраст: " << endl;
    cin >> Age;
    cout << "Введите пол: " << endl;
    cin >> Pol;
}
 
virtual void print_info () {
cout << Surname << ", Возраст: " << Age << ", Пол: " << Pol << ", ";
}
 
~Human() {}
 
};
 
class Student : public Human {
    private:
        unsigned short int Kurs, Number, Medium_mark;
    public:
        Student () {
Kurs = 2;
Number = 12745;
Medium_mark = 5;
        }
 
Student (unsigned short int date_Kurs, unsigned short int date_Number, unsigned short int Medium_mark) {
Kurs = date_Kurs;
Number = date_Number;
Medium_mark = Medium_mark;
}
 
        void input_info() {
cout << "Введите курс на котором обучается студент: " << endl;
    cin >> Kurs;
    cout << "Введите номер зачётки: " << endl;
    cin >> Number;
    cout << "Средняя оценка студента: " << endl;
    cin >> Medium_mark;
        }
 
     void print_info () {
cout << "Обучается на: " << Kurs << " курсе" << ", Номер зачётки: " << Number << ", ";
}
 
        void Excellent () {
            if (Medium_mark == 5) {
cout << "Средняя оценка: " << Medium_mark;
            }
            else {
                cout << "Не отличник - средняя оценка " << Medium_mark;
            }
        }
        
        ~Student () {}
 
    };
 
    class prof : public Human {
        private:
        string special;
        int year_special;
        public:
            prof () {
                special = "Информатика и вычислительная техника";
                year_special = 4;
            }
            void print_info () {
                cout << "Специальность: " << special << ", " << "Срок обучения: " << year_special;
            }
    };
 
int main(int argc, char const *argv[])
{
    system("chcp 1251");
 
Human objHuman("Белявцев", 19, "Мужчина");
objHuman.input_info();
 
Student objStudent(2, 12345, 4);
objStudent.input_info();
 
objHuman.print_info();
objStudent.print_info();
objStudent.Excellent();
 
prof objprof;
objprof.print_info(); cout << " года";
 
    return 0;
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.10.2018, 23:16
Цитата Сообщение от koks_ikkkk Посмотреть сообщение
И я создаю указатель на базовый класс, но не знаю как под указатель поместить объект производного класса prof. Как это сделать?
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
#include <iostream>
 
class Mammal
{
public:
    virtual void sound() const = 0;
};
 
class Cat : public Mammal
{
public:
    void sound() const
    {
        std::cout << "meow!\n";
    }
};
 
class Dog : public Mammal
{
public:
    void sound() const
    {
        std::cout << "woof\n";
    }
};
 
int main()
{
    Mammal* c = new Cat();
    c->sound();
    delete c;
    c = new Dog();
    c->sound();
    delete c;
}
Добавлено через 4 минуты
Цитата Сообщение от koks_ikkkk Посмотреть сообщение
Расскажите пожалуйста о конфликтах имён.
если ты поймешь что такое пространства имен, вопрос о конфликте имен сам должен испариться)))))
1
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
11.10.2018, 18:00  [ТС]
С указателями я справился, сейчас попытаюсь понять "пространство имён"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2018, 18:00
Помогаю со студенческими работами здесь

Виртуальное наследование (указатель на базовый класс)
У меня ромбическая иерархия классов, при попытке вызвать метод производного класса ошибка, что я не так делаю? Вот исходный код ...

Указатель на базовый класс и дружественные функции
Здравствуйте. У меня есть базовый класс Number-простое целое число типа long int. В классе имеется 2 дружественных функции, перегрузка...

Создание объекта через указатель на базовый абстрактный класс
Есть абстрактный класс, от него наследуется 3 класса. В программе предусмотрено создание нового объекта(добавление клиента страховой...

Запись объекта в файл через указатель на базовый класс
Можно ли при помощи write как-нибудь записать массив объектов производных классов в файл, используя для обращения к ним указатель на...

Передача в контейнер объекта через указатель на базовый класс
Передаю в stl контейнер list указатель на производный класс, предварительно приведя его к типу производного класса - программа вылетает.В...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru