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

Неоднозначность при множественном наследовании

11.10.2016, 17:39. Показов 2227. Ответов 8

Привет всем, столкнулся с проблемой при множественном наследовании классов. Надеюсь, кто-нибудь поможет как можно скорее.
Ошибка возникает в классе Dealer.
В нем почему-то недоступны и поля protected и метода public из класса Human.
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
class Human
{
protected:
        ...
public:
    Human(void);
        ...
    ~Human(void);
};
//-----------------------------------------------------------------------------
class Tourist : public Human
{
protected:
       ...
public:
    Tourist(void);
        ...
    ~Tourist(void);
};
//-----------------------------------------------------------------------------
class Businessman : public Human
{
protected:
        ...
public:
    Businessman(void);
    ...
    ~Businessman(void);
};
//-----------------------------------------------------------------------------
class Dealer : public Businessman, public Tourist
{
protected:
    ...
public:
    Dealer(void);
    ~Dealer(void);
};
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2016, 17:39
Ответы с готовыми решениями:

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

Конструктор при множественном наследовании
#include <string> class Worker // an abstract base class { private: std::string...

Инициализация при множественном наследовании
Имеется иерархия типов. Во главе: базовый класс-интерфейс, далее один базовый класс, от него два...

Конструкторы с параметрами при множественном наследовании
у меня есть класс, quotes который является базовым для двух классов moving_average и rsi...

8
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.10.2016, 17:48 2
Всё должно работать - пишите пример с Foo, Bar и выкладывайте посмотрим
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 16
11.10.2016, 17:56  [ТС] 3
Тот же пример с классами Foo, Foo1, Foo2, Bar
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
class Foo
{
protected:
    int cxValueFoo;
public:
    void SomeMethod(void)
    {
        cout << "Class Foo" << endl;
    }
};
 
class Foo1 : public Foo
{
protected:
    int cxValueFoo1;
public:
    void SomeMethodFoo1(void)
    {
        cout << "Class Foo1" << endl;
    }
};
 
class Foo2 : public Foo
{
protected:
    int cxValueFoo2;
public:
    void SomeMethodFoo2(void)
    {
        cout << "Class Foo2" << endl;
    }
};
 
class Bar : public Foo1, public Foo2
{
protected:
    int cxValueBar;
public:
    void SomeMethodBar(void)
    {
        cout << "Class Bar" << endl;
    }
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Bar myBar;
    myBar.SomeMethod(); // Ошибка в этой строке "Неоднозначный уровень доступа SomeMethod"
    myBar.SomeMethodFoo1();
    myBar.SomeMethodFoo2();
    _getch();
    return 0;
}
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.10.2016, 18:04 4
nubone,

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
#include <iostream>
using namespace std;
 
class Foo
{
protected:
    int cxValueFoo;
public:
    void SomeMethod( void )
    {
        cout << "Class Foo" << endl;
    }
};
 
class Foo1 : public Foo
{
protected:
    int cxValueFoo1;
public:
    void SomeMethodFoo1( void )
    {
        cout << "Class Foo1" << endl;
    }
};
 
class Foo2 : public Foo
{
protected:
    int cxValueFoo2;
public:
    void SomeMethodFoo2( void )
    {
        cout << "Class Foo2" << endl;
    }
};
 
class Bar : public Foo1, public Foo2
{
protected:
    int cxValueBar;
public:
    void SomeMethodBar( void )
    {
        cout << "Class Bar" << endl;
    }
};
 
 
int main()
{
    setlocale( LC_ALL, "Russian" );
    
    Bar myBar;
    myBar.Foo1::SomeMethod(); // Ошибка в этой строке "Неоднозначный уровень доступа SomeMethod"
    myBar.SomeMethodFoo1();
    myBar.SomeMethodFoo2();
 
    return 0;
}
Проблема в том, что компилятор не поймёт к какому Foo::SomeMethod вы обращаетесь. Представьте там метод setName - и не понятно кому вы меняете имя Foo1 или Foo2
0
Эксперт С++
3207 / 1734 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
11.10.2016, 18:13 5
Цитата Сообщение от nubone Посмотреть сообщение
столкнулся с проблемой при множественном наследовании классов
И не вы первый!
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 16
11.10.2016, 18:21  [ТС] 6
В том то и дело, что в задании к этой лабораторной написано, что именно так и должно быть сконструировано наследование. Методы и поля классов Foo1 и Foo2 доступны и проблем с этим нет. Мне нужно достать методы из родителя всех классов - класса Foo. Только эти методы недоступны, хотя должно быть все в порядке
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.10.2016, 18:39 7
nubone, еще раз скажите слово "недоступны" и я позвоню вашему преподавателю, чтобы тот влепил вам двойку.

Прочтите тему сверху вниз - возможно там найдутся интересные ключевые слова для вас и возможно даже ссылки если повезёт.
0
0 / 0 / 0
Регистрация: 24.02.2015
Сообщений: 16
11.10.2016, 19:02  [ТС] 8
rikimaru2013, То, что вы предложили, конечно, работает. Но это некорректно. Класс Bar должен отнаследовать все поля и метода Foo и обращаться к ним как к собственным, а не через Human::
0
15129 / 8125 / 1963
Регистрация: 30.01.2014
Сообщений: 13,809
11.10.2016, 19:22 9
Цитата Сообщение от nubone Посмотреть сообщение
Но это некорректно. Класс Bar должен отнаследовать все поля и метода Foo и обращаться к ним как к собственным, а не через Human::
Выше дали ссылку. Тут нужно виртуальное наследование.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2016, 19:22

Компилятор не видит класс при множественном наследовании
Есть два одноименных класса. Один класс - подкласс SomeClass. Другой класс - наследник первого...

Помогите найти ошибку при множественном наследовании
Помогите разобраться в наследовании Прилагаю код #include &lt;iostream&gt; using namespace...

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

Конфликт имен при множественном наследовании struct
Уважаемые гуру, помогите разрешить конфликт имён в приведённом ниже примере, не изменяя структуру...


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

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

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