С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,004
Записей в блоге: 1
1

Множественное наследование

25.07.2015, 09:16. Показов 5580. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Делаю следующее задание по подготовке к экзамену по С++. Пока только начал. Вкратце - есть абстрактный класс. Его наследует следующий абстрактный класс. Его наследует обычный класс.

Программа не компилируется. Пишет следующее:

[maxim@localhost Desktop]$ g++ Targil5_1.cpp -o Targil5_1
/tmp/cc8LYhST.o: In function `HomeWork::HomeWork()':
Targil5_1.cpp: (.text._ZN8HomeWorkC2Ev[_ZN8HomeWorkC5Ev]+0x1f): undefined reference to `vtable for HomeWork'
/tmp/cc8LYhST.o : In function `HomeWork::~HomeWork()':
Targil5_1.cpp: (.text._ZN8HomeWorkD2Ev[_ZN8HomeWorkD5Ev]+0x14): undefined reference to `vtable for HomeWork'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
[maxim@localhost Desktop]$

Работаю, как вы поняли, в терминале Сентос 7 из под gedit ( переход в Eclipse ситуацию не прояснил )

Сейчас выложу код...

Добавлено через 1 минуту
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
#include <iostream>
#include <string>
using namespace std;
 
//------------- class Base --------------------
 
class Base
{
protected:
    string fullName;
 
    Base(){ fullName=""; }
    ~Base(){ cout << "Base d'tor called..." << endl; }
    virtual void finalMarkOut()=0;
    virtual void Print()=0;
};
 
//---------------- class Mark ---------------------
 
class Mark : public Base
{
protected:
    int itsMark;
 
    Mark(){}
    ~Mark(){ cout << "Mark d'tor called..." << endl; }
    virtual void finalMarkOut()=0;
    virtual void Print()=0;
};
 
//--------------- class HomeWork ----------------------
 
class HomeWork : public Mark
{
public:
    HomeWork(){ itsMark=0; }
    ~HomeWork(){ cout << "HomeWork d'tor called..." << endl; }
    virtual void finalMarkOut();
    virtual void Print();
};
 
//------------- main() ------------------------------
 
int main()
{
    HomeWork hw;
    cout << "OK" << endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2015, 09:16
Ответы с готовыми решениями:

Множественное наследование
Здравствуйте, всем! Я на этом форуме впервые. Пытаюсь изучать С++ самостоятельно. Литература...

Множественное наследование
По этой схеме нужно сделать множественное наследование. Вот код:#include &lt;iostream&gt; #include...

Множественное наследование
Имеется множественное наследование в виде треугольника. Если в обоих базовых классах имеются поля с...

Множественное наследование
У меня есть 3 класса Book class Book { protected: string namebook; string author; string...

10
Неэпический
18108 / 10695 / 2062
Регистрация: 27.09.2012
Сообщений: 26,928
Записей в блоге: 1
25.07.2015, 09:19 2
C++
1
2
    virtual void finalMarkOut();
    virtual void Print();
Реализацию напишите
0
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,004
Записей в блоге: 1
25.07.2015, 09:21  [ТС] 3
Спасибо. Забываю делать реализацию :-)))
0
Модератор
Эксперт С++
13706 / 10909 / 6473
Регистрация: 18.12.2011
Сообщений: 29,125
25.07.2015, 09:22 4
Во всех классах конструкторы и виртуальные функции должны быть public, а не protected.
0
13 / 13 / 5
Регистрация: 13.06.2015
Сообщений: 60
25.07.2015, 09:29 5
C++
1
HomeWork* hw;
и усьо ок. но я изменил из protected на public
0
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,004
Записей в блоге: 1
25.07.2015, 09:35  [ТС] 6
zss, почему? protected значит что данные доступны только наследующим классам. Я не хочу, чтобы их можно было вызывать из main()'a, например.

Вроде все работает пока, как Croessmah, советовал...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.07.2015, 12:39 7
Цитата Сообщение от max_sk Посмотреть сообщение
protected значит что данные доступны только наследующим классам.
Для данных следует делать либо полностью private, либо полностью public. А вот для функций уже можно и protected. Всё это нужно для лучшего обеспечения целостности класса.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.07.2015, 13:03 8
Цитата Сообщение от max_sk Посмотреть сообщение
Множественное наследование
Это не множественное. Вы перепутали немного.
0
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,004
Записей в блоге: 1
25.07.2015, 14:57  [ТС] 9
Это было начало. Дальше идет множественное. Щас выложу код, кому интересно... :-)

Добавлено через 58 секунд
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <iostream>
#include <string>
using namespace std;
 
//------------- class Base --------------------
 
class Base
{
protected:
    string fullName;
 
    Base(){ fullName=""; }
    ~Base(){ cout << "Base d'tor called..." << endl; }
    virtual void finalMarkOut()=0;
    virtual void Print()=0;
};
 
//---------------- class Mark ---------------------
 
class Mark : public Base
{
protected:
    float itsMark;
 
    Mark(){}
    ~Mark(){ cout << "Mark d'tor called..." << endl; }
    virtual void finalMarkOut()=0;
    virtual void Print()=0;
};
 
//--------------- class HomeWork ----------------------
 
class HomeWork : virtual public Mark
{
protected:
    float itsMark;
public:
    HomeWork(){ itsMark=100; }
    ~HomeWork(){ cout << "HomeWork d'tor called..." << endl; }
    void finalMarkOut();
    void Print();
};
 
void HomeWork::finalMarkOut()
{
    itsMark=100;
}
 
void HomeWork::Print()
{
    cout << "HomeWork. Final Mark is: " << itsMark << endl;
}
 
//------------- class Exam -----------------------------
 
class Exam : virtual public Mark
{
protected:
    float itsMark;
public:
    Exam(){ itsMark=70; }
    ~Exam(){ cout << "Exam d'tor called..." << endl; }
    void finalMarkOut();
    void Print();
};
 
void Exam::finalMarkOut()
{
    itsMark=100;
}
 
void Exam::Print()
{
    cout << "Exam. Final Mark is: " << itsMark << endl;
}
 
//--------------- class Project ----------------------
 
class Project : virtual public Mark
{
protected:
    float itsMark;
public:
    Project(){ itsMark=85; }
    ~Project(){ cout << "Project d'tor called..." << endl; }
    void finalMarkOut();
    void Print();
};
 
void Project::finalMarkOut()
{
    itsMark=100;
}
 
void Project::Print()
{
    cout << "Project. Final Mark is: " << itsMark << endl;
}
 
//-------------- class ProjExam ---------------------
 
class ProjExam : public Project, public Exam
{
public:
    ProjExam();
    ~ProjExam(){ cout << "ProjExam d'tor called..." << endl; }
    void finalMarkOut();
    void Print();
};
 
ProjExam::ProjExam(): Project(), Exam()
{
    this->Mark::itsMark=this->Project::itsMark*0.5+this->Exam::itsMark*0.5;
}
 
void ProjExam::finalMarkOut()
{
    this->Mark::itsMark=this->Project::itsMark*0.5+this->Exam::itsMark*0.5;
}
 
void ProjExam::Print()
{
    cout << "Project and Exam. Final Mark is: " << this->Mark::itsMark << endl;
}
 
//--------------- class HWExam ---------------------------
 
class HWExam : public HomeWork, public Exam
{
public:
    HWExam();
    ~HWExam(){ cout << "Homework and Exam d'tor called..." << endl; }
    void finalMarkOut();
    void Print();
};
 
HWExam::HWExam(): HomeWork(), Exam()
{
    this->Mark::itsMark=this->HomeWork::itsMark*0.2+this->Exam::itsMark*0.8;
}
 
void HWExam::finalMarkOut()
{
    this->Mark::itsMark=this->HomeWork::itsMark*0.2+this->Exam::itsMark*0.8;
}
 
void HWExam::Print()
{
    cout << "Homework and Exam. Final Mark is: " << this->Mark::itsMark << endl;
}
 
//------------- main() ------------------------------
 
int main()
{
    /*HomeWork hw;
    hw.Print();
 
    Exam exm;
    exm.Print();
 
    Project prj;
    prj.Print();*/
 
    ProjExam prj_exm;
    prj_exm.Print();
 
    HWExam hw_exm;
    hw_exm.Print();
 
    cout << "OK" << endl;
 
    return 0;
}
Добавлено через 1 минуту
Код рабочий, но не доделанный. Пропал интерес возиться с ним. Буду делать следующее задание... :-)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.07.2015, 16:26 10
Цитата Сообщение от max_sk Посмотреть сообщение
Пропал интерес возиться с ним. Буду делать следующее задание
Прежде чем переходить к новому, надо отточить старое.
Например: сделать в базовом классе виртуальный деструктор;
добавить const для функций-членов, которые не изменяют состояние объекта (типа Print);
разрулить ситуацию с данными, о которой я упоминал в предыдущем сообщении.
0
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,004
Записей в блоге: 1
25.07.2015, 16:56  [ТС] 11
Tulosba, спасибо, но сегодня уже мозги кипят. Займусь этим в следующие выходные...
0
25.07.2015, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2015, 16:56
Помогаю со студенческими работами здесь

множественное наследование
Мечтаю реализовать такую иерархию human-&gt;employee-&gt;doctor в реализации doctor ругает конструктор....

Множественное наследование
Вычислите площадь и периметр прямоугольника, если известны его диагональ и одна из сторон.

Множественное наследование
7 задание Сделайте пожалуйста, большое спасибо! :good:

Множественное наследование
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу (O) из класса (С) ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru