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

Ромб в множественном наследовании

03.10.2015, 12:50. Показов 1587. Ответов 6
Метки нет (Все метки)

Добрый день !

Не помню как устранить проблему ромба в множественном наследовании. Вроде нужно втулить куда-то слово виртуал

2 раза идет вызов конструктора класса А.

первый с конструктора В второй с С

Помогите пожалуйста устранить эту проблему.

И как устранить неопределенность
C++
1
cout<<"А::x = "<<a.A::func()<<endl;
?

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
class A
{
    int x;
public:
A() : x(0) {cout<<"Конструктор А 1"<<endl;}
A(int a) : x(a) {cout<<"Конструктор А 2 "<<x<<endl;}
int func() const {return x;}
};
class B : public A
{
    int x;
public:
B(int a) :  A(a*a),x(a) {cout<<"Конструктор B"<<endl;}
int func() const {return x;}
};
class C : public A
{
    int x;
public:
C(int a) : A(a*a), x(a) {cout<<"Конструктор C"<<endl;}
int func() const {return x;}
};
class D : public B, public C
{
    int x;
public:
D(int a, int b) : B(a), C(b), x(a+b) {cout<<"Конструктор D"<<endl;}
int func() const {return x;}
};
 
 
int main() 
{
    D a(12,78);
    cout<<"D::x = "<<a.func()<<endl;
    cout<<"B::x = "<<a.B::func()<<endl;
    cout<<"C::x = "<<a.C::func()<<endl;
    //cout<<"А::x = "<<a.A::func()<<endl;
    
    return 0;
}
вывод на экран

Конструктор А 2 144
Конструктор B
Конструктор А 2 6084
Конструктор C
Конструктор D
D::x = 90
B::x = 12
C::x = 78
0

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

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

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

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

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

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

6
Модератор
Эксперт С++
10731 / 8887 / 5368
Регистрация: 18.12.2011
Сообщений: 23,777
03.10.2015, 12:55 2
Пример из Википедии
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
    int foo() {
        return 1;
    }
};
 
class B: public virtual A {};
 
class C : public virtual A {};
 
class D : public B, public C {};
 
int main () {
    D d;
    std::cout << d.foo();
    return 0;
}
0
Заблокирован
03.10.2015, 15:44  [ТС] 3
C++
1
class B : virtual public A
так тоже работает

почему ?

Добавлено через 1 час 2 минуты
У меня в догоночку такой вопрос .

при ромбе конструктор класса А нужно вызывать из класса D ?

C++
1
 D(int a, int b) : A(a*a), B(a), C(b), x(a+b) {cout<<"Конструктор D"<<endl;}
0
Заблокирован
04.10.2015, 17:40  [ТС] 4
Добрый день !
Подскажите пожалуйста почему не работает строка

C++
1
2
    c->B::func_1();
        c->C::func_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
#include <iostream>
using namespace std;
 
class A
{public:
virtual void func_1()=0;
};
void A::func_1() {}
class B : public virtual A
{public:
virtual void func_1() {cout<<"1111111111"<<endl;}
};
class C : public virtual A
{public:
virtual void func_1() {cout<<"22222222"<<endl;}
};
class D : public B, public C
{public:
virtual void func_1() {cout<<"33333333333"<<endl;}
};
 
int main() {
    A *c = new D;
    c->C::func_1();
    return 0;
}
0
1 / 1 / 1
Регистрация: 08.02.2020
Сообщений: 156
10.02.2020, 03:53 5
Чтобы не плодить новую тему, спрошу тут Подскажите новичку в ООП, как это решить.

С обычным наследованием вроде разобрался кое-как, вот пробую разобраться во множественном. Есть класс А, в котором четыре свойства. От него наследуются классы B и C, в каждом из которых меняется одна из переменных, от них обоих наследуется еще один. На выходе рассчитываю получить класс D, в котором изменены две переменные. Насколько понимаю, это классическая проблема ромба - только из чтения статей я так и не понял, как ее решить

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
#include <iostream>
 
using namespace std;
 
class ClassA
{
  public:
         int A,
              B,
              C,
              D;
 
         ClassA (int ia, int ib, int ic, int id)
         {
              A = ia;
              B = ib;
              C = ic;
              D = id;
         }
};
 
class ClassB:  public virtual ClassA
{
  public:
         ClassB (int ia, int ib, int ic, int id): ClassA (ia, ib, ic, id)
         {
            B=15;
         }
};
 
 
 
class ClassC: public virtual ClassA
{
  public:
         ClassC (int ia, int ib, int ic, int id): ClassA (ia, ib, ic, id)
         {
            C=25;
         }
};
 
 
class ClassD: public ClassB ,  public ClassC
{
 //  ClassD (int ia, int ib, int ic, int id): ClassA (ia, ib, ic, id) { };
};
 
int main()
{
 
 
 
    ClassA  ExA(1,2,3,4);
 
 cout<<"ClassA A="<<ExA.A<<endl;
 cout<<"ClassA B="<<ExA.B<<endl;
 cout<<"ClassA C="<<ExA.C<<endl;
 cout<<"ClassA D="<<ExA.D<<endl<<endl;
 
 
     ClassB  ExB(1,2,3,4);
 
 cout<<"ClassB A="<<ExB.A<<endl;
 cout<<"ClassB B="<<ExB.B<<endl;
 cout<<"ClassB C="<<ExB.C<<endl;
 cout<<"ClassB D="<<ExB.D<<endl<<endl;
 
 
     ClassC  ExC(1,2,3,4);
 
 cout<<"ClassC A="<<ExC.A<<endl;
 cout<<"ClassC B="<<ExC.B<<endl;
 cout<<"ClassC C="<<ExC.C<<endl;
 cout<<"ClassC D="<<ExC.D<<endl<<endl;
 
 
    ClassD  ExD;
 
 cout<<"ClassD A="<<ExD.A<<endl;
 cout<<"ClassD B="<<ExD.B<<endl;
 cout<<"ClassD C="<<ExD.C<<endl;
 cout<<"ClassD D="<<ExD.D<<endl;
 
 
    return 0;
}
0
14447 / 7834 / 1880
Регистрация: 30.01.2014
Сообщений: 13,234
10.02.2020, 08:48 6
archerix,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ClassD: public ClassB, public ClassC
{
public:
  ClassD (int ia, int ib, int ic, int id): ClassA (ia, ib, ic, id), ClassB(ia, ib, ic, id), ClassC(ia, ib, ic, id)
  { }
};
//............
 
    ClassD  ExD(1,2,3,4);
 
 cout<<"ClassD A="<<ExD.A<<endl;
 cout<<"ClassD B="<<ExD.B<<endl;
 cout<<"ClassD C="<<ExD.C<<endl;
 cout<<"ClassD D="<<ExD.D<<endl;
1
1 / 1 / 1
Регистрация: 08.02.2020
Сообщений: 156
10.02.2020, 09:43 7
Спасибо, заработало Будем разбираться дальше
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2020, 09:43

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

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

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

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

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


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

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

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