13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
1

Родительский класс неявно влияет на значение переменной наследника

10.02.2014, 11:50. Показов 719. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал элементарную программу на тему наследования: есть родительский класс, у которого есть 2 наследника. У наследников есть свои собственные переменные. Все работает нормально.
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
#include <iostream>
#include <cstdlib>
using namespace std;
///базовый класс///
class publication
{
private:
    static const int lim=80;
    char name[lim];
    float cost;
public:
    void set();
    void get();
};
void publication::set()
{
    cout<<"nazvanie: ";
    cin.get(name, lim);
    cout<<"stoimost: ";
    cin>>cost;
}
void publication::get()
{
    cout<<"nazvanie: "<<name<<endl;
    cout<<"stoimost: "<<cost<<endl;
}
///наследник 1///
class book:private publication
{
private:
    int str;
public:
    book(){cin.sync();}
    void get()
    {
        publication::get(); // вызов метода базового класса
        cout<<"stranic: "<<str<<endl;
    }
    void set()
    {
        publication::set(); // вызов метода базового класса
        cout<<"stranic: ";
        cin>>str;
    }
};
///наследник 2///
class audio:private publication
{
private:
    float time;
public:
    audio(){cin.sync();}
    void get()
    {
        publication::get(); // вызов метода базового класса
        cout<<"vremya (minut): "<<time;
    }
    void set()
    {
        publication::set(); // вызов метода базового класса
        cout<<"vremya (minut): ";
        cin>>time;
    }
};
int main()
{
    book a;
    a.set();
    a.get();
    audio b;
    b.set();
    b.get();
    system("pause");
    return 0;
}
Но когда изменяю эту программу так чтобы наследники имели 2 родительских класса, то при вызове наследником методов второго родителя - значение переменной наследника почему-то изменяется
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
#include <iostream>
#include <cstdlib>
using namespace std;
///базовый класс 1///
class publication
{
private:
    static const int lim=80;
    char name[lim];
    float cost;
public:
    void set();
    void get();
};
void publication::set()
{
    cout<<"nazvanie: ";
    cin.get(name, lim);
    cout<<"stoimost: ";
    cin>>cost;
}
void publication::get()
{
    cout<<"nazvanie: "<<name<<endl;
    cout<<"stoimost: "<<cost<<endl;
}
///базовый класс 2///
class sales
{
private:
    double arr[2];
public:
    void set()
    {
        cout<<"vvedite obem prodash za 1 mesyac: ";
        cin>>arr[0];
        cout<<"za 2 mesyac: ";
        cin>>arr[1];
        cout<<"za 3 mesyac: ";
        cin>>arr[2];
    }
    void get()
    {
        cout<<"1: "<<arr[0]<<endl
            <<"2: "<<arr[1]<<endl
            <<"3: "<<arr[2]<<endl;
    }
};
        
///наследник 1///
class book:private publication, private sales
{
private:
    int str;
public:
    book(){cin.sync();}
    void get()
    {
        publication::get(); // вызов метода базового класса 1
        cout<<"stranic: "<<str<<endl;
        sales::get(); // вызов метода базового класса 2
    }
    void set()
    {
        publication::set(); // вызов метода базового класса 1
        cout<<"stranic: ";
        cin>>str;
        sales::set(); // вызов метода базового класса 2
    }
};
///наследник 2///
class audio:private publication, private sales
{
private:
    float time;
public:
    audio(){cin.sync();}
    void get()
    {
        publication::get(); // вызов метода базового класса 1
        cout<<"vremya (minut): "<<time;
        sales::get(); // вызов метода базового класса 2
    }
    void set()
    {
        publication::set(); // вызов метода базового класса 1
        cout<<"vremya (minut): "; 
        cin>>time;
        sales::set(); // вызов метода базового класса 2
    }
};
int main()
{
    book a;
    a.set();
    a.get();
    audio b;
    b.set();
    b.get();
    system("pause");
    return 0;
}
Программа должна дублировать то что введено пользователем
Родительский класс неявно влияет на значение переменной наследника
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2014, 11:50
Ответы с готовыми решениями:

Передача объекта-наследника по r-value ссылке на родительский класс
Здоровеньки булы. Собственно, код: class x { protected: int a; public: x() {} x(int i)...

3 класса. Родительский класс - класс животных. Два класса наследника: Гиппопотамы и Зебры. Выбор структуры данных
Добрый День. Есть задача. Есть 3 класса. Родительский класс - это класс животных. Он абстрактный и...

Почему дочерний div влияет на родительский?
Здравствуйте. &lt;div class=&quot;container&quot; id=&quot;scroll&quot;&gt; &lt;div class=&quot;banner&quot;&gt; &lt;div...

Описать класс Car и его наследника, класс Avto
Создать класс Автомобиль: Поля: - Марка - приватный - Габариты (А, Б, С) - публичный ...

1
5496 / 4891 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.02.2014, 13:17 2
C++
1
2
private:
    double arr[2];
Массив на два double, а вводите три значения:
C++
1
2
3
4
5
6
7
8
9
void set()
    {
        cout<<"vvedite obem prodash za 1 mesyac: ";
        cin>>arr[0];
        cout<<"za 2 mesyac: ";
        cin>>arr[1];
        cout<<"za 3 mesyac: ";
        cin>>arr[2];
    }
И:
C++
1
cout<<"vremya (minut): " << time << endl; // endl добавьте
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2014, 13:17
Помогаю со студенческими работами здесь

Описать класс Car и его наследника, класс Sedan
Описать базовый класс CAR (автомашина) со свойствами: •*Марка машины; На его основе создать...

Класс создающий класс и любого его наследника
Есть класс: #pragma once #include &lt;string&gt; #include &quot;Entity.h&quot; class ObjectList { private:...

Как сделать открытым свойство для наследника но закрытым для наследника наследника?
Есть класс GameObject в котором есть свойство Coordinates Класс Animal наследуется от GameObject и...

Вывод переменной из наследника класса
Здравствуйте. Как можно вывести значение переменной класса из наследника, изменив это значение в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru