Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76

Проблемы с множественным наследованием

25.04.2020, 07:13. Показов 1109. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, повторяю листинг за С.Прата. Очередной листинг по множественному наследованию воспроизвести не получается, проблемы именно как я понимаю в конструкторах класса
C++
1
SingingWaiter
.

workermi.h
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
#pragma once
#include <string>
 
class Worker
{
private:
    std::string full_name;
    long id;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Worker() : full_name("no one"), id(0L) {};
    Worker(const std::string& s, long n)
        : full_name(s), id(n) {};
    virtual ~Worker() = 0;
    virtual void Set() = 0;
    virtual void Show() = 0;
};
 
class Waiter :virtual public Worker {
private:
    int panache;
protected:
    void Data() const;
    void Get();
public:
    Waiter() :Worker(), panache(0) {};
    Waiter(const std::string& s, long n, int p = 0)
        : Worker(s, n), panache(p) {};
    Waiter(const Worker& wk, int p = 0)
        : Worker(wk), panache(0) {};
    void Set();
    void Show() const;
};
 
class Singer :virtual public Worker {
protected:
    enum {
        other, alto, contralto, soprano,
        bass, baritone, tenor
    };
    enum { Vtypes = 7 };
    void Data() const;
    void Get();
private:
    static const char* pv[Vtypes];
    int voice;
    Singer() : Worker(), voice(other) {};
    Singer(const std::string& s, long n, int v = other)
        :Worker(s, n), voice(v) {};
    Singer(const Worker& wk, int v = other)
        :Worker(wk), voice(v) {};
    void Set();
    void Show() const;
};
 
// Множественное наследование
class SingingWaiter : public Singer, public Waiter {
protected:
    void Data() const;
    void Get();
public:
    SingingWaiter() {};
    SingingWaiter(const std::string& s, long n, int p = 0, int v = other)
        : Worker(s, n), Waiter(s, n, p), Singer(s, n, v) {};
    SingingWaiter(const Worker& wk, int p = 0, int v = other)
        : Worker(wk), Waiter(wk, p), Singer(wk, v) {};
    SingingWaiter(const Worker& wk, int v = other)
        :Worker(wk), Waiter(wk), Singer(wk, v) {};
    SingingWaiter(const Worker& wk, int p = 0)
        :Worker(wk), Waiter(wk, p), Singer(wk) {};
    void Set();
    void Show() const;
};
workermi.cpp
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>
#include "workermi.h"
 
using std::cout;
using std::cin;
using std::endl;
 
// Методы Worker
Worker::~Worker() {};
// Защищённые методы
void Worker::Data() const {
    cout << "Name: " << full_name << endl;
    cout << "Employee ID: " << id << endl;
}
void Worker::Get() {
    getline(cin, full_name);
    cout << "Enter worker's ID";
    cin >> id;
    while (cin.get() != '\n') {
        continue;
    }
}
 
// Методы Waiter
void Waiter::Set() {
    cout << "Enter waiter's name: ";
    Worker::Get();
    Get();
}
 
void Waiter::Show() const {
    cout << "Category: waiter\n";
    Worker::Data();
    Data();
}
 
// Защищённые методы
void Waiter::Data() const {
    cout << "Panache rating: " << panache << endl;
}
 
void Waiter::Get() {
    cout << "Enter waiter's panache rating: ";
    cin >> panache;
    while (cin.get() != '\n') {
        continue;
    }
}
 
// Мутоды Singer
const char* Singer::pv[Vtypes] = { "other", "alto", "contralto",
                                "soprano", "bass", "baritone","tenor" };
 
void Singer::Set() {
    cout << "Enter singers's name: ";
    Worker::Get();
    Get();
}
 
void Singer::Show() const {
    cout << "Category singer\n";
    Worker::Data();
    Data();
}
 
// Защищённые методы
void Singer::Data() const {
    cout << "Vocal range: " << pv[voice] << endl;
}
 
void Singer:: Get() {
    cout << "Enter number for singer's vocal range:\n";
    int i;
    for (i = 0; i < Vtypes; i++) {
        cout << i << ": " << pv[i] << " ";
        if (i % 4 == 3)
            cout << endl;
    }
    if (i % 4 != 0)
        cout << '\n';
    cin >> voice;
    while (cin.get() != '\n')
        continue;
}
 
// Методы SingingWaiter
void SingingWaiter::Data() const {
    Singer::Data();
    Waiter::Data();
}
 
void SingingWaiter::Get() {
    Waiter::Get();
    Singer::Get();
}
 
void SingingWaiter::Set() {
    cout << "Enter singing waiter's name: ";
    Worker::Get();
    Get();
}
 
void SingingWaiter::Show() const {
    cout << "Category: singing waiter\n";
    Worker::Data();
    Data();
}
workmi_test.cpp
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
#include "workermi.h"
#include <iostream>
#include <cstring>
 
const int SIZE = 5;
 
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::strchr;
 
    Worker* lolas[SIZE];
    int ct;
    for (ct = 0; ct < SIZE; ct++) {
        char choice;
        cout << "Enter the employee category:\n"
            << "w: waiter s: singer "
            << "t: singing waiter q: quit\n";
        cin >> choice;
        while (strchr("wstq", choice) == NULL) {
            cout << "Please enter a w, s, t, or q: ";
            cin >> choice;
        }
        if (choice == 'q')
            break;
        switch (choice)
        {
        case 'w':lolas[ct] = new Waiter;
            break;
        case 's':lolas[ct] = new Singer;
            break;
        case 't':lolas[ct] = new SingingWaiter;
            break;
        }
        cin.get();
        lolas[ct]->Set();
    }
    cout << "\nHere is your staff:\n";
    int i;
    for (i = 0; i < ct; i++) {
        cout << endl;
        lolas[i]->Show();
    }
    for (i = 0; i < ct; i++) {
        delete lolas[i];
    }
    cout << "Bye.\n";
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2020, 07:13
Ответы с готовыми решениями:

Класс со множественным наследованием
Доброе день! Необходимо оперативно написать программу, надеюсь на вашу помощь! Текст программы: Написать класс &quot;Автомобиль&quot; с...

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

Проблемы с наследованием
Выпадает такая ошибка Error 3 error C2259: 'Operator' : cannot instantiate abstract class d:\учёба\ооп\терминал...

11
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.04.2020, 07:37
Цитата Сообщение от Antoniy274 Посмотреть сообщение
проблемы именно как я понимаю в конструкторах класса
О каких именно "проблемах" идет речь вы решили скромно умолчать?

Почему вдруг в классе Singer почти все сделано private? В частности конструктор является private. Как же вы будете создавать такие объекты?

Почему в классе Singer дважды объявлен один и тот же конструктор?

C++
1
2
3
4
    SingingWaiter(const Worker& wk, int v = other)
        :Worker(wk), Waiter(wk), Singer(wk, v) {};
    SingingWaiter(const Worker& wk, int p = 0)
        :Worker(wk), Waiter(wk, p), Singer(wk) {};
Манера ставить ; после определения методов внутри класса - это в книге так?
0
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:03  [ТС]
TheCalligrapher, спасибо за указание ошибки в классе Singer.

А данные конструкторы разные, так как они принимают разные аргументы

C++
1
2
3
4
SingingWaiter(const Worker& wk, int v = other)
        :Worker(wk), Waiter(wk), Singer(wk, v) {};
    SingingWaiter(const Worker& wk, int p = 0)
        :Worker(wk), Waiter(wk, p), Singer(wk) {};
; я сам начал ставить, так как не привычно видеть окончание строки без неё, не заметил чтобы это влияло на работу программы.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.04.2020, 08:08
Цитата Сообщение от Antoniy274 Посмотреть сообщение
А данные конструкторы разные, так как они принимают разные аргументы
Не надо выдумывать. Разные функции или не разные в языке С++ определяется сигнатурой функции, т.е. ее именем и количеством и типами параметров. У вас в классе объявлено две функции с одной и той же сигнатурой, что запрещено правилами языка и о чем вам радостно сообщает компилятор.

И это не последняя ошибка в коде.
0
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:12  [ТС]
TheCalligrapher, я не выдумываю, учусь только лишь
0
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:18  [ТС]
TheCalligrapher, ошибка найдена спасибо.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.04.2020, 08:24
Цитата Сообщение от Antoniy274 Посмотреть сообщение
я не выдумываю
Когда я говорю про "выдумывание", я имею в виду ваши рассуждения о "разных аргументах". А то, что в книге допущена ошибка/опечатка - в этом ничего странного нет.
0
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:24  [ТС]
TheCalligrapher, ошибка найдена спасибо, исправил:

C++
1
2
3
4
SingingWaiter(const Worker& wk, int v = other)
        :Worker(wk), Waiter(wk), Singer(wk, v) {};
    SingingWaiter(const Singer& wk, int p = 0)
        :Worker(wk), Waiter(wk, p), Singer(wk) {};
но "Ошибка (активно) E0322 использование объекта абстрактного типа класса "Waiter" не допускается"
и такая ошибка к каждому представленному классу внизу

C++
1
2
3
4
5
6
7
8
9
switch (choice)
        {
        case 'w':lolas[ct] = new Waiter;
            break;
        case 's':lolas[ct] = new Singer;
            break;
        case 't':lolas[ct] = new SingingWaiter;
            break;
        }
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.04.2020, 08:31
В шестом издании этот класс выглядит так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// multiple inheritance
class SingingWaiter : public Singer, public Waiter
{
protected:
  void Data() const;
  void Get();
public:
  SingingWaiter() {}
  SingingWaiter(const std::string & s, long n, int p = 0, int v = other)
    : Worker(s,n), Waiter(s, n, p), Singer(s, n, v) {}
  SingingWaiter(const Worker & wk, int p = 0, int v = other)
    : Worker(wk), Waiter(wk,p), Singer(wk,v) {}
  SingingWaiter(const Waiter & wt, int v = other)
    : Worker(wt),Waiter(wt), Singer(wt,v) {}
  SingingWaiter(const Singer & wt, int p = 0)
    : Worker(wt),Waiter(wt,p), Singer(wt) {}
  void Set();
  void Show() const;
};
Как видите здесь этой ошибки нет.
0
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:33  [ТС]
TheCalligrapher, так же ещё пишет это:

"Ошибка (активно) E0322 использование объекта абстрактного типа класса "Waiter" не допускается:" ..... "чистая виртуальная функция функцию "Worker::Show" не имеет оператора переопределения"

Может это потому, что в самом методе Worker функция Show() никак не определена?

Добавлено через 1 минуту
TheCalligrapher, тут тоже норм, это я виноват, но легче от этого не стало.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.04.2020, 08:35
Цитата Сообщение от Antoniy274 Посмотреть сообщение
но "Ошибка (активно) E0322 использование объекта абстрактного типа класса "Waiter" не допускается"
Потому что в классе Worker у вас

C++
1
virtual void Show() = 0;
а в классе Waiter

C++
1
2
void Show() const;
            ^^^^^
Из-за этого const метод Show класса Worker остается неперекрытым. А он - pure virtual.

Метод Show везде задуман как const, и т.ч. и в Worker. В шестом издании этой ошибки тоже нет.
1
11 / 6 / 3
Регистрация: 20.03.2019
Сообщений: 76
25.04.2020, 08:38  [ТС]
TheCalligrapher, спасибо, очень стыдно, что не могу нормально переписать, как же Вам тут трудно приходится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2020, 08:38
Помогаю со студенческими работами здесь

Проблемы с наследованием классов
1-е задание: Создать класс базовый класс «вещественное число». Элементы класса (поля имеют статус доступа protected): поле,...

Проблемы с наследованием классов
При наследовании Group от Student, при том, что Student унаследован от Subject, в Group нет методов класса Subject, уже вроде все проверил,...

Проблемы с наследованием QMainWindow
Здравствуйте, уважаемые форумчане. У меня появилась на первый взгляд простая проблема, но я никак не пойму, в чем ее корень. Я пишу...

Как в java решают проблему с множественным наследованием (его отсутствием)
Интересует следующий вопрос: как в java решают проблему с множественным наследованием (его отсутствием). К примеру у нас есть класс...

Получить доступ к методу: проблемы с наследованием
Есть базовый класс class A { protected virtual void Method () {} } класс Б наследуется от класса А в нем...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru