Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
1

Наследование, полиморфизм

03.05.2015, 21:30. Просмотров 1365. Ответов 13
Метки нет (Все метки)

Не могу реализовать полиморфизм для метода getShow() ну и в теории сетШов(). Но сейчас о гете говорим. Я создал дополнительный класс Objects который будет иметь один и тот же тип данных для разных классов, сделал их динамичными и запилил в цыкл. Но подчеркивает мои методы, хотя я их множественным наследованием прописую в общем помогите ребята пожалуйста Вот код:
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
115
116
117
118
119
120
121
122
123
#include<iostream>
#include<conio.h>
#include<string>
#include<iomanip>
using namespace std;
class Objects
{
public:
void setShow();
void getShow();
};
class student : public Objects
{
private:
    string numberGroup;
    string lastName;
public:
    student() {}
    student(string a, string b) : numberGroup(a), lastName(b) {}
    friend istream &operator>>(istream &in, student &i);
    friend ostream &operator <<(ostream &out, const student &w);
    ~student() {}
    student& operator=(student m);
    
    
};
    void student::setShow()
    {
 
        cout<<"Номер группы: "<<numberGroup<<endl;
        cout<<"Фамилия студента: "<<lastName<<endl;
    }
    void student::getShow()
    {
        cout<<numberGroup<<endl;
        cout<<lastName<<endl;
    }
    istream &operator>>(istream &in, student &i)
    {
        in>>i.lastName;
        return in;
    }
    ostream &operator <<(ostream &out, const student &w)
    {
        out<<w.lastName;
        return out;
    }
class lecturer : public Objects
{
private:
    string surname;
    string position;
public:
    lecturer() {}
    lecturer(string _a, string _b) : surname(_a), position(_b) {}
    ~lecturer() {}
 
    
};
student& student::operator=(student m)
{return m;}
void lecturer::setShow()
    {
        cout<<"Фамилия преподавателя: "<<surname<<endl;
        cout<<"Должность :"<<position<<endl;
    }
 
void lecturer::getShow()
    {
        cout<<surname<<endl;
        cout<<position<<endl;
    }
class exam : public Objects, public student, public lecturer
{
protected:
    string subjName;
    int learnSubj;//Кредит на изучение
    int point;
    string dataExame;
public:
    exam () {}
    exam (int l, int p) :  learnSubj(l), point(p) {} 
    exam ( string s, string d) : subjName(s), dataExame(d) {} 
 
    ~exam() {}
};
void exam::setShow()
{
    cout<<"Предмет: "<<subjName<<endl;
    cout<<"Кредиты: "<<learnSubj<<endl;
    cout<<"Балы: "<<point<<endl;
    cout<<"Дата сдачи экзамена: "<<dataExame<<endl;
}
void exam::getShow()
{
    cout<<setw(1)<<subjName<<setw(1)<<learnSubj<<setw(1)<<point<<setw(1)<<dataExame;
}
 
int main ()
{
    system("chcp 1251");
    system("cls");
 
    student c("K-13-2","Honchenko");
    c.setShow();
    c.getShow();    
    /*student a1;
    cout<<"Ввод новой фамилии: ";
    cin>>a1;
    cout<<"Вывод новой фамилии: "<<a1<<endl;*/
    
 
    Objects *mass[3];
    mass[0]=new student;
    mass[1]=new lecturer;
    mass[2]=new exam;
    for(int i=0; i<3;i++)
    {
        mass[i]->getShow();
    }
    _getch();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2015, 21:30
Ответы с готовыми решениями:

Наследование и полиморфизм...
Есть спецы в этой теме?) Сейчас пишу курсовую, в методичке (препод сильно снижает за отклонения от...

Наследование и полиморфизм.
Вопрос следующий. Как мне вытащить функцию из родителя класса родителя, при условии что родителей...

Полиморфизм, наследование
Товарищи, кто может, объясните пожалуйста. Просят добавить новый тип объектов Trap. Методы в нем...

Наследование и полиморфизм
Добрый день ребятюни!! Срочно требуется ваша помощь! Программа которая служит для вывода...

13
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
03.05.2015, 22:03 2
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
class Objects
{
public:
    virtual void setShow() = 0;
    virtual void getShow() = 0;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class student : public Objects
{
private:
    string numberGroup;
    string lastName;
public:
    student() {}
    student(string a, string b) : numberGroup(a), lastName(b) {}
    friend istream &operator>>(istream &in, student &i);
    friend ostream &operator <<(ostream &out, const student &w);
    ~student() {}
    student& operator=(student m);
    void setShow();
    void getShow();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class lecturer : public Objects
{
private:
    string surname;
    string position;
public:
    lecturer() {}
    lecturer(string _a, string _b) : surname(_a), position(_b) {}
    ~lecturer() {}
    void setShow();
    void getShow();
 
 
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class exam : public Objects
{
protected:
    string subjName;
    int learnSubj;//Кредит на изучение
    int point;
    string dataExame;
public:
    exam () {}
    exam (int l, int p) :  learnSubj(l), point(p) {}
    exam ( string s, string d) : subjName(s), dataExame(d) {}
 
    ~exam() {}
    void setShow();
    void getShow();
};


Сделайте эти функции виртуальными и переопределяйте их в каждом классе так, как вам нужно
0
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
03.05.2015, 22:23  [ТС] 3
Как то не очень работает вернее не работает :C
Cod:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include<iostream>
#include<conio.h>
#include<string>
#include<iomanip>
using namespace std;
class Objects
{
public:
virtual void setShow()=0;
virtual void getShow()=0;
};
class student : public Objects
{
private:
    string numberGroup;
    string lastName;
public:
    student() {}
    student(string a, string b) : numberGroup(a), lastName(b) {}
    friend istream &operator>>(istream &in, student &i);
    friend ostream &operator <<(ostream &out, const student &w);
    student& operator=(student m);
    void setShow();
    void getShow();
    ~student() {}
    
};
    void student::setShow()
    {
 
        cout<<"Номер группы: "<<numberGroup<<endl;
        cout<<"Фамилия студента: "<<lastName<<endl;
    }
    void student::getShow()
    {
        cout<<numberGroup<<endl;
        cout<<lastName<<endl;
    }
    istream &operator>>(istream &in, student &i)
    {
        in>>i.lastName;
        return in;
    }
    ostream &operator <<(ostream &out, const student &w)
    {
        out<<w.lastName;
        return out;
    }
class lecturer : public Objects
{
private:
    string surname;
    string position;
public:
    lecturer() {}
    lecturer(string _a, string _b) : surname(_a), position(_b) {}
    void setShow();
    void getShow();
    ~lecturer() {}
 
    
};
student& student::operator=(student m)
{return m;}
void lecturer::setShow()
    {
        cout<<"Фамилия преподавателя: "<<surname<<endl;
        cout<<"Должность :"<<position<<endl;
    }
 
void lecturer::getShow()
    {
        cout<<surname<<endl;
        cout<<position<<endl;
    }
class exam : public Objects, public student, public lecturer
{
private:
    string subjName;
    int learnSubj;//Кредит на изучение
    int point;
    string dataExame;
public:
    exam () {}
    exam (int l, int p) :  learnSubj(l), point(p) {} 
    exam ( string s, string d) : subjName(s), dataExame(d) {} 
    void setShow();
    void getShow();
    ~exam() {}
};
void exam::setShow()
{
    cout<<"Предмет: "<<subjName<<endl;
    cout<<"Кредиты: "<<learnSubj<<endl;
    cout<<"Балы: "<<point<<endl;
    cout<<"Дата сдачи экзамена: "<<dataExame<<endl;
}
void exam::getShow()
{
    cout<<setw(1)<<subjName<<setw(1)<<learnSubj<<setw(1)<<point<<setw(1)<<dataExame;
}
 
int main ()
{
    system("chcp 1251");
    system("cls");
 
    student c("K-13-2","Honchenko");
        lecturer l("Lavrenuk", "prepod");
        exam e("OOP","120");
        exam e1("90","1.06.2015");
    /*student a1;
    cout<<"Ввод новой фамилии: ";
    cin>>a1;
    cout<<"Вывод новой фамилии: "<<a1<<endl;*/
    
 
    Objects *mass[3];
    mass[0]=new student;
    mass[1]=new lecturer;
    mass[2]=new exam;
    for(int i=0; i<3;i++)
    {
        mass[i]->getShow();
    }
    _getch();
    return 0;
}
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
03.05.2015, 22:25 4
Цитата Сообщение от dykee Посмотреть сообщение
class exam : public Objects, public student, public lecturer
Скорее всего из-за этого.

Какие ошибки показывает?
0
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
03.05.2015, 22:30  [ТС] 5
Оно компилирует, но в консоле неопознанные числа -8666456464 что то такое
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
03.05.2015, 23:28 6
Это из-за того, что некоторые переменные не инициализируются при создании объекта класса.
Конкретно в классе exam:
Цитата Сообщение от dykee Посмотреть сообщение
exam () {}
0
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
04.05.2015, 16:47  [ТС] 7
Хорошо, подскажите тогда как определить объект класса exam
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
class exam : public Objects, public student, public lecturer
{
private:
    string subjName;
    int learnSubj;//Кредит на изучение
    int point;
    string dataExame;
public:
    exam () {}
    exam (int l, int p, string s, string d) :  learnSubj(l), point(p), subjName(s), dataExame(d) {} 
    
    void setShow();
    void getShow();
    ~exam() {}
};
void exam::setShow()
{
    cout<<"Предмет: "<<subjName<<endl;
    cout<<"Кредиты: "<<learnSubj<<endl;
    cout<<"Балы: "<<point<<endl;
    cout<<"Дата сдачи экзамена: "<<dataExame<<endl;
}
void exam::getShow()
{
    cout<<subjName<<setw(1)<<learnSubj<<setw(1)<<point<<setw(1)<<dataExame;
}
в мейне:
C++
1
exam e("120","90","OOP","1.06.2015");
или как?
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
04.05.2015, 17:06 8
C++
1
class exam : public Objects, public student, public lecturer

Не по теме:

Если не ошибаюсь, то из-за такого множественного наследования возникают проблемы с вызовом деструкторов, так как класс objects у класса exam наследуется аж 3 раза. 1 раз прямым наследованием и 2 раза косвенным.



Не совсем понятно, зачем так много базовых классов для класса exam. Если нужно просто вывести данные полей этого класса, как вы это уже сделали у других двух классов, то достаточно унаследовать функции от класса objects и переопределить их в классе exam.

Цитата Сообщение от dykee Посмотреть сообщение
в мейне:
C++
1
exam e("120","90","OOP","1.06.2015");
или как?
Не так. Вы же в конструкторе написали такую последовательность:
C++
1
exam (int l, int p, string s, string d) :  learnSubj(l), point(p), subjName(s), dataExame(d) {}
Поэтому при инициализации пишите:
C++
1
exam e(123, 321, "string1", "string2");
P.S. Лучше напишите, что именно хотите в итоге получить

Добавлено через 3 минуты
В конструкторы по умолчанию напишите ко всем классам инициализацию всех переменных, чтобы там не было мусора.
C++
1
student(): numberGroup(), lastName()  {}
И так далее для остальных классов
1
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
04.05.2015, 17:12  [ТС] 9
Я хочу получить полиморфизм метода гетшоу(), что б через него в столбик были выведенные те значения которые я задал в объекте. и тот вопрос по поводу что класс экзамен наследует 3 класса это задача курсача хотя я не пойму зачем если там даже полей одинаковых нет, сейчас скину задание курсача может вы что то посоветуете или поможете дописать 5 задание что б оно корректно было





И если можно, схематически накидать код под 6.
0
Миниатюры
Наследование, полиморфизм  
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
04.05.2015, 17:40 10
Если просто вывести через виртуальные методы, то так:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include<iostream>
#include<conio.h>
#include<string>
#include<iomanip>
using namespace std;
 
class Objects
{
public:
    Objects() {}
    virtual ~Objects() {}
    virtual void setShow() = 0;
    virtual void getShow() = 0;
};
 
 
class student : public Objects
{
private:
    string numberGroup, lastName;
public:
    student(): numberGroup(), lastName() {}
    student(string a, string b) : numberGroup(a), lastName(b) {}
    friend istream &operator>>(istream &in, student &i);
    friend ostream &operator <<(ostream &out, const student &w);
    ~student() {}
    student& operator=(const student &m) { numberGroup = m.numberGroup;
                                           lastName = m.lastName;
                                           return *this;
                                         }
    void setShow();
    void getShow();
};
 
void student::setShow()
{
 
    cout<<"Номер группы: "<<numberGroup<<endl;
    cout<<"Фамилия студента: "<<lastName<<endl;
}
 
void student::getShow()
{
    cout<<numberGroup<<endl;
    cout<<lastName<<endl;
}
 
istream &operator>>(istream &in, student &i)
{
    in >> i.lastName;
    return in;
}
 
ostream &operator <<(ostream &out, const student &w)
{
    out << w.lastName;
    return out;
}
 
class lecturer : public Objects
{
private:
    string surname, position;
public:
    lecturer(): surname(), position() {}
    lecturer(string _a, string _b) : surname(_a), position(_b) {}
    ~lecturer() {}
    void setShow();
    void getShow();
};
 
void lecturer::setShow()
{
    cout<<"Фамилия преподавателя: "<<surname<<endl;
    cout<<"Должность :"<<position<<endl;
}
 
 
void lecturer::getShow()
{
    cout<<surname<<endl;
    cout<<position<<endl;
}
 
class exam : public Objects
{
private:
    string subjName, dataExame;
    int learnSubj, point;
public:
    exam ():  subjName(), dataExame(), learnSubj(), point() {}
    exam (int l, int p, string s, string d)
    {
        point = p;
        learnSubj = l;
        subjName = s;
        dataExame = d;
 
    }
    ~exam() {}
    void setShow();
    void getShow();
};
void exam::setShow()
{
    cout<<"Предмет: "<<subjName<<endl;
    cout<<"Кредиты: "<<learnSubj<<endl;
    cout<<"Балы: "<<point<<endl;
    cout<<"Дата сдачи экзамена: "<<dataExame<<endl;
}
void exam::getShow()
{
    cout<<setw(1)<<subjName<<setw(1)<<learnSubj<<setw(1)<<point<<setw(1)<<dataExame;
}
 
int main ()
{
 
    student c("K-13-2","Honchenko");
    c.setShow();
    c.getShow();
 
    Objects *mass[3];
    mass[0]=new student("123","321");
    mass[1]=new lecturer("123321","321123");
    mass[2]=new exam(1,2,"111","000");
 
    for(int i=0; i<3;i++)
    {
        mass[i]->getShow();
    }
    return 0;
}
С множественным наследованием попробую что-нибудь придумать, но сама суть задания мне не ясна ^_^

Не по теме:

На картинке мне ничего не понятно, так как не понимаю, что там написано :)

1
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
04.05.2015, 19:24  [ТС] 11
ааа вы с России? Ну 5 сейчас переведу: в границах иерархии классов построить полиморфичный кластер на основе виртуального метода вывода поточного значения фамилия студента/препода или название предмета(ряд символов)
6. Класс "Зачетка" в котором есть массив объекта класса экзамен. Вывести данные по результату сдачи экзаменов (этот подпункт можно наброску)?
и на счет 5 я ж правильно про полиморфизм понял, мы то выводим?

Добавлено через 1 час 37 минут
7. Для работы с объектами массивов класса екзамен нужно построить и использовать класс итератор. то есть 6-7 задания они дополняют друг друга, по этому я Вас попросил накидать их схематически
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
04.05.2015, 19:42 12
Лучший ответ Сообщение было отмечено dykee как решение

Решение

5 задание, судя по всему вы правильно поняли.
6 задание, как уже я понял, должно выглядеть примерно так:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include<iostream>
#include<conio.h>
#include<string>
#include<iomanip>
using namespace std;
 
class Objects
{
public:
    Objects() {}
    virtual ~Objects() {}
    virtual void setShow() = 0;
    virtual void getShow() = 0;
};
 
 
class student : public Objects
{
private:
    string numberGroup, lastName;
public:
    student(): numberGroup(), lastName() {}
    student(string a, string b) : numberGroup(a), lastName(b) {}
    friend istream &operator>>(istream &in, student &i);
    friend ostream &operator <<(ostream &out, const student &w);
    ~student() {}
    student& operator=(const student &m) { numberGroup = m.numberGroup;
                                           lastName = m.lastName;
                                           return *this;
                                         }
    void setShow();
    void getShow();
};
 
void student::setShow()
{
 
    cout<<"Номер группы: "<<numberGroup<<endl;
    cout<<"Фамилия студента: "<<lastName<<endl;
}
 
void student::getShow()
{
    cout<<numberGroup<<endl;
    cout<<lastName<<endl;
}
 
istream &operator>>(istream &in, student &i)
{
    in >> i.lastName;
    return in;
}
 
ostream &operator <<(ostream &out, const student &w)
{
    out << w.lastName;
    return out;
}
 
class lecturer : public Objects
{
private:
    string surname, position;
public:
    lecturer(): surname(), position() {}
    lecturer(string _a, string _b) : surname(_a), position(_b) {}
    ~lecturer() {}
    void setShow();
    void getShow();
};
 
void lecturer::setShow()
{
    cout<<"Фамилия преподавателя: "<<surname<<endl;
    cout<<"Должность :"<<position<<endl;
}
 
 
void lecturer::getShow()
{
    cout<<surname<<endl;
    cout<<position<<endl;
}
 
class exam : public Objects
{
private:
    string subjName, dataExame;
    int learnSubj, point;
public:
    exam ():  subjName(), dataExame(), learnSubj(), point() {}
    exam (int l, int p, string s, string d)
    {
        point = p;
        learnSubj = l;
        subjName = s;
        dataExame = d;
 
    }
    ~exam() {}
    void setShow();
    void getShow();
};
void exam::setShow()
{
    cout<<"Предмет: "; cin >>subjName; cout << endl;
    cout<<"Кредиты: "; cin >> learnSubj; cout << endl;
    cout<<"Балы: "; cin >> point;  cout << endl;
    cout<<"Дата сдачи экзамена: "; cin >> dataExame; cout << endl;
}
void exam::getShow()
{
    cout<<setw(1)<<subjName<<setw(1)<<learnSubj<<setw(1)<<point<<setw(1)<<dataExame;
}
 
class result
{
private:
    exam *massive;
    int size;
public:
    result() : size() {}
    result(int amount); //amount - количество студентов, информацию о которых нужно вывести
    ~result() { delete[] massive; }
    void getShow();
    void setShow();
};
 
result::result(int amount)
{
    massive = new exam[amount];
    size = amount;
}
 
void result::getShow()
{
    for(int i = 0 ; i < size ; ++i)
    {
        massive[i].getShow();
    }
}
 
void result::setShow() // Заполнение массива данными
{
    for(int i = 0 ; i < size ; ++i)
        massive[i].setShow();
}
Соответственно, в классе result(зачетка) мы храним массив данных с типом exam, который заполняем в функции
C++
1
setShow();
Вывод производится в функции
C++
1
getShow();
Добавлено через 4 минуты
Если предполагается работа с итераторами, то логичнее всего использовать вектор в классе result.
C++
1
vector<exam> massive;
1
0 / 0 / 0
Регистрация: 28.04.2015
Сообщений: 53
04.05.2015, 19:48  [ТС] 13
Спасибо большое очень помогли
0
Arkaniy
04.05.2015, 20:16     Наследование, полиморфизм
  #14

Не по теме:

dykee, Гонь, подвязывай.

0
04.05.2015, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2015, 20:16
Привет! Вот еще темы с ответами:

Полиморфизм, наследование
Создать абстрактный базовый класс с виртуальной функцией*— площадь. Создать производные классы:...

Наследование и полиморфизм
Написать демонстрационную программу, в которой создаются объекты различных классов. Определение...

ООП Полиморфизм Наследование
У меня есть базовый класс и 2 производных от него класса... Как сделать, чтобы в программе я мог...

Наследование и полиморфизм классов
Доброго времени суток. Суть задания определить иерархию классов; Классы - тест, экзамен,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.