С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
11 / 1 / 0
Регистрация: 26.11.2018
Сообщений: 61

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

15.04.2019, 21:47. Показов 3029. Ответов 11

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Выполняю дом. работу в плюсах по ООП. Не могу разобраться с реализацией функций.

Задание:
Имеются два класса от которых наследуется третий класс.
В первых двух класса создать конструктор и методы Set, GetКаждыйПараметр и Print.
В третьем классе надо создать конструктор и методы Set и Print.

Отобразите вызовы функций GetКаждыйПараметр из третьего класса.

На данный момент не могу понять как правильно реализовать функции и как в GetКаждыйПараметр добавить переменные string.

В голове куча всего и что-то пошло не так.

Помогите разобратся пожалуйста

Мой код на этот момент:
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
#include <iostream>
#include <string>
 
using namespace std;
 
class Text
{
protected:
    int size, data;     //parametri
    string font, color;
public:
    Text(int size, int data, string color, string font)//Konstruktors ar parametru
        :size(size), data(data), color(color), font(font)
    {
    }
 
    void SetText(int a, int b, const string) //Set metode
    {
        size = a;
        data = b;
        color = "RED";
        font = "Arial";
    }
 
    int GetKatrsParametrs() const //GetКаждыйПараметр
    {
        return size;
        return data;
        return color;
        return font;
    }
 
    //int GetData() const //Get metode
    //{
    //  return data;
    //}
 
    //const string GetColor() const //Get metode
    //{
    //  return color;
    //}
 
    //const string GetFont() const //Get metode
    //{
    //  return font;
    //}
 
    virtual void PrintText() //Print
    {
        cout << "Size -  " << size << "Data -  " << data << "Font -  " << font << "Color -  " << color << endl;
        cout << "==========================================" << endl;
    }
};
 
class Box
{
protected:
    int width, height;      //parametri
    string border_color;
public:
    Box(int width, int height, string border_color)//Konstruktors ar parametru
        :width(width), height(height), border_color(border_color)
    {
    }
 
    void SetText(int e, int f, const string) //Set metode
    {
        width = e;
        height = f;
        border_color = "WHITE";
 
    }
 
    int GetKatrsParametrs() const //GetКаждыйПараметр
    {
        return width;
        return height;
        return border_color;
    }
 
    //int GetHeight() const //Get metode
    //{
    //  return height;
    //}
 
    //const string GetBorder_Color() const //Get metode
    //{
    //  return border_color;
    //}
 
 
    virtual void PrintText() //Print
    {
        cout << "Width -  " << width << "Height -  " << height << "Border Color -  " << border_color << endl;
        cout << "==========================================" << endl;
    }
};
 
class TextBox : public Text, public Box
{
public:
 
    TextBox(int width, int height, int size, int data, const string& Text, const string& Box)//Konstruktors ar parametru
        :Text(size, data, font, color), Box (width, height, border_color)
    {
    }
 
    void SetTextBox(int h, int i, int k, int l, string Text, string Box) //Set metode
    {
        
        size = h;
        data = i;
        width = k;
        height = l;
        border_color = "GREEN";
        color = "BLACK";
        font = "Helvetica";
 
    }
 
    virtual void PrintTextBox() //Print
    {
        cout << "Width -  " << width << "Height -  " << height << "Border Color -  " << border_color 
        << "Size -  " << size <<"Data -  " << data << "Font -  " << font << "Color -  " << color << endl;
        cout << "==========================================" << endl;
    }
 
 
};
 
int main()
{
 
    cout << "\t\tTextBox:" << endl;
    TextBox
 
 
    cout << endl;
 
 
    delete Text; //atbrivojam atminu
    delete Box; //atbrivojam atminu
    delete TextBox; //atbrivojam atminu
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2019, 21:47
Ответы с готовыми решениями:

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

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

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

11
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
15.04.2019, 21:54
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    int GetKatrsParametrs() const //GetКаждыйПараметр
    {
        return size;
        return data;
        return color;
        return font;
    }
 
    //int GetData() const //Get metode
    //{
    //  return data;
    //}
 
    //const string GetColor() const //Get metode
    //{
    //  return color;
    //}
 
    //const string GetFont() const //Get metode
    //{
    //  return font;
    //}
ну вообще-то, закомментированы зачем-то правильные вещи, в отличие от...
0
15.04.2019, 21:59

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну вообще-то, закомментированы зачем-то правильные вещи, в отличие от...
до них он просто еще не добрался XD

0
11 / 1 / 0
Регистрация: 26.11.2018
Сообщений: 61
15.04.2019, 22:11  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну вообще-то, закомментированы зачем-то правильные вещи, в отличие от...
Приветствую! Закомментированное это мой начальный код, а вот то что задание запрашивает один Геттер на все параметры меня выбило из колеи или просто (скорее всего) я просто не до конца понял задание.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.04.2019, 22:15
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
(скорее всего)
...
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
15.04.2019, 22:56
если уж очень сильно приспичило, то вот.
C++
1
2
3
4
5
6
7
    void GetKatrsParametrs(int& a, int& b, string& c, font &f) //GetКаждыйПараметр
    {
        a =font;
        b = data;
        c= color;
        f = font;
    }
но так делать 1) некрасиво 2) Базовый С-style C++ следует хорошо знать до того как берёшься за ООП и классы.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.04.2019, 23:25
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
Отобразите вызовы функций GetКаждыйПараметр из третьего класса.
функци й
(й != и) == true это равно тру. Это значит что функций много не бывает. Первое движение было правильным. Деструкторов виртуальных напишите. А в main создайте два указателя (на оба базовых) и каждый установите на адрес дочернего объекта. Потом позовите виртуальные методы. Надо же насладиться результатами трудов... А текст и ящик смешать, это круто. Говорящая коробка. Или: - Из гробика послышалось: -"Виртуально тут. И холодно. ". Богатые возможности, - что и говорить.
1
11 / 1 / 0
Регистрация: 26.11.2018
Сообщений: 61
16.04.2019, 18:42  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
если уж очень сильно приспичило, то вот.
C++Выделить код
1
2
3
4
5
6
7
* * void GetKatrsParametrs(int& a, int& b, string& c, font &f) //GetКаждыйПараметр
* * {
* * * * a =font;
* * * * b = data;
* * * * c= color;
* * * * f = font;
* * }
но так делать 1) некрасиво 2) Базовый С-style C++ следует хорошо знать до того как берёшься за ООП и классы.
Большое спасибо! Каждый совет для меня на вес золота! Учту на будущее



Цитата Сообщение от IGPIGP Посмотреть сообщение
функци й
(й != и) == true это равно тру. Это значит что функций много не бывает. Первое движение было правильным. Деструкторов виртуальных напишите. А в main создайте два указателя (на оба базовых) и каждый установите на адрес дочернего объекта. Потом позовите виртуальные методы. Надо же насладиться результатами трудов... А текст и ящик смешать, это круто. Говорящая коробка. Или: - Из гробика послышалось: -"Виртуально тут. И холодно. ". Богатые возможности, - что и говорить.
Позновательно и с юмором Спасибо Вам! Я попробую
0
 Аватар для Krokodil9798
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
16.04.2019, 19:44
Лучший ответ Сообщение было отмечено Sklifasovsky как решение

Решение

Sklifasovsky, ознакомьтесь с кодом и задавайте вопросы.
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
#include <iostream>
#include <string>
 
using namespace std;
 
class Text
{
private:
    int size, data;
    string font, color;
 
public:
    Text(int newSize = 1, int newData = 2, const string& newColor = "RED", const string& newFont = "Times New Roman")
        :size(newSize), data(newData), color(newColor), font(newFont)
    {
    }
 
    void setData(int newSize = 1, int newData = 2, const string& newColor = "RED", const string& newFont = "Times New Roman")
    {
        size = newSize;
        data = newData;
        color = newFont;
        font = newColor;
    }
 
    int getSize() const
    {
        return size;
    }
 
    int getData() const
    {
        return data;
    }
 
    const string& getColor() const
    {
        return color;
    }
 
    const string& getFont() const
    {
        return font;
    }
 
    virtual void Print() const
    {
        cout << "Size -  " << size << ", Data -  " << data << ", Font -  " << font << ", Color -  " << color << endl;
        cout << "==========================================" << endl;
    }
 
    virtual ~Text() 
    {
        std::cout << "I am destructor for class Text!" << std::endl;
    }
};
 
class Box
{
private:
    int width, height;
    string borderColor;
 
public:
    Box(int newWidth = 100, int newHeight = 200, const string& newBorderColor = "Black")
        :width(newWidth), height(newHeight), borderColor(newBorderColor)
    {
    }
 
    void setText(int newWidth = 100, int newHeight = 200, const string& newBorderColor = "Black")
    {
        width = newWidth;
        height = newHeight;
        borderColor = newBorderColor;
    }
 
    int getHeight() const
    {
        return height;
    }
 
    int getWidth() const
    {
        return width;
    }
 
    const string& getBorderColor() const
    {
        return borderColor;
    }
 
    virtual void Print() const
    {
        cout << "Width -  " << width << ", Height -  " << height << ", Border Color -  " << borderColor << endl;
        cout << "==========================================" << endl;
    }
 
    virtual ~Box()
    {
        std::cout << "I am destructor for class Box!" << std::endl;
    }
};
 
class TextBox : public Text, public Box
{
public:
 
    TextBox()
        :Text(), Box()
    {
    }
 
    void SetTextBox(int size, int data, const string& newColor, const string& newFont, int newWidth, int newHeight, const string& newBorderColor)
    {
        Text::setData(size, data, newColor, newFont);
        Box::setText(newWidth, newHeight, newBorderColor);
    }
 
    void Print() const override
    {
        Text::Print();
        Box::Print();
    }
 
    ~TextBox() override
    {
        std::cout << "I am destructor for class TextBox!" << std::endl;
    }
};
 
int main()
{
    Text * text = new Text();
    Box * box = new Box();
    TextBox * textBox = new TextBox();
 
    text->Print();
    std::cout << std::endl;
 
    box->Print();
    std::cout << std::endl;
 
    textBox->Print();
    std::cout << std::endl;
 
    delete text;
    delete box;
    delete textBox;
 
    system("pause");
}
1
11 / 1 / 0
Регистрация: 26.11.2018
Сообщений: 61
16.04.2019, 20:41  [ТС]
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
Sklifasovsky, ознакомьтесь с кодом и задавайте вопросы.
Приветствую!

Большое спасибо за Ваше потраченное время и проведенную работу!

Вопросы добавил в коде
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
#include <iostream>
#include <string>
 
using namespace std;
 
class Text //Первый базовый класс
{
private:
    int size, data; //Переменные
    string font, color;
 
public:
    Text(int newSize = 1, int newData = 2, const string& newColor = "RED", const string& newFont = "Times New Roman") //Конструктор (Почему переменная string со ссылкой?)
        :size(newSize), data(newData), color(newColor), font(newFont)
    {
    }
 
    void setData(int newSize = 1, int newData = 2, const string& newColor = "RED", const string& newFont = "Times New Roman") //Сеттер переменных (Почему переменная string со ссылкой?)
    {
        size = newSize; //устонавливаем для переменных новые данные?
        data = newData;
        color = newFont;
        font = newColor;
    }
 
    int getSize() const // Геттер переменной (Почему const?)
    {
        return size;
    }
 
    int getData() const
    {
        return data;
    }
 
    const string& getColor() const // Геттер переменной (Почему const?)
    {
        return color;
    }
 
    const string& getFont() const
    {
        return font;
    }
 
    virtual void Print() const //Вывод данных (Почему virtual и const?)
    {
        cout << "Size -  " << size << ", Data -  " << data << ", Font -  " << font << ", Color -  " << color << endl;
        cout << "==========================================" << endl;
    }
 
    virtual ~Text() //Вызываем деструктор? Почему?
    {
        cout << "I am destructor for class Text!" << endl;
    }
};
 
class Box //Второй базовый класс
{
private:
    int width, height; //Переменные
    string borderColor;
 
public:
    Box(int newWidth = 100, int newHeight = 200, const string& newBorderColor = "Black") //Конструктор с уже установленными значениями
        :width(newWidth), height(newHeight), borderColor(newBorderColor)
    {
    }
 
    void setText(int newWidth = 100, int newHeight = 200, const string& newBorderColor = "Black")
    {
        width = newWidth;
        height = newHeight;
        borderColor = newBorderColor;
    }
 
    int getHeight() const
    {
        return height;
    }
 
    int getWidth() const
    {
        return width;
    }
 
    const string& getBorderColor() const
    {
        return borderColor;
    }
 
    virtual void Print() const
    {
        cout << "Width -  " << width << ", Height -  " << height << ", Border Color -  " << borderColor << endl;
        cout << "==========================================" << endl;
    }
 
    virtual ~Box()
    {
        cout << "I am destructor for class Box!" << endl;
    }
};
 
class TextBox : public Text, public Box
{
public:
 
    TextBox()//Конструктор (Добовляем данные двух базовых классов?)
        :Text(), Box()
    {
    }
 
    void SetTextBox(int size, int data, const string& newColor, const string& newFont, int newWidth, int newHeight, const string& newBorderColor) //Устонавливаем данные от двух базовых классов?
    {
        Text::setData(size, data, newColor, newFont);
        Box::setText(newWidth, newHeight, newBorderColor);
    }
 
    void Print() const override //Чуть по подробней про эту функцию можно пожалуйста?
    {
        Text::Print();
        Box::Print();
    }
 
    ~TextBox() override //Почему деструктор с override?
    {
        cout << "I am destructor for class TextBox!" << endl;
    }
};
 
int main()
{
    Text * text = new Text(); //Создаем класс в динамической памяти?
    Box * box = new Box(); //Создаем класс в динамической памяти?
    TextBox * textBox = new TextBox(); //Создаем класс в динамической памяти?
 
    text->Print(); //Вывод данных класов?
    cout << endl;
 
    box->Print();
    cout << endl;
 
    textBox->Print();
    cout << endl;
 
    delete text; //Освобождаем динамическую память?
    delete box;
    delete textBox;
 
    system("pause");
    //Почему не используется return 0; 
}
0
 Аватар для Krokodil9798
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
16.04.2019, 21:59
Лучший ответ Сообщение было отмечено Sklifasovsky как решение

Решение

Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
Text(int newSize = 1, int newData = 2, const string& newColor = "RED", const string& newFont = "Times New Roman") //Конструктор (Почему переменная string со ссылкой?)
Это позволит передать переменную без ненужного копирования. Например:
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
#include <iostream>
#include <string>
 
class String
{
    std::string str = "New copy!";
public:
    String()
    {
        std::cout << "New class String!" << std::endl;
    }
    String(const String&)
    {
        std::cout << str << std::endl;
    }
    ~String()
    {
        std::cout << "I am destructor!" << std::endl;
    }
};
 
void foo(String s)
{
    std::cout << "Foo!" << std::endl;
}
 
void bar(const String& str)
{
    std::cout << "Bar!" << std::endl;
}
 
int main()
{
    String str;
 
    std::cout << std::endl;
    foo(str);
 
    std::cout << std::endl;
    bar(str);
    system("pause");
}
Изучите работу данного кода.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
size = newSize; //устонавливаем для переменных новые данные?
Да.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
int getSize() const // Геттер переменной (Почему const?)
Const метод можно вызывать как и для константного экземпляра класса, так и для неконстантного. Метод, помеченный как const, гарантирует что он ничего не изменит в состоянии класса за время своей работы. Например:
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>
 
class String
{
    int value;
public:
    void foo() { std::cout << "Foo!" << std::endl; value = 5; }
    void bar() const { std::cout << "Bar!" << std::endl; value = 5;}
    void third() const { std::cout << "Third!" << std::endl; }
};
 
int main()
{
    String firstStr;
    const String secondStr;
 
    firstStr.foo();
    firstStr.bar();
    firstStr.third();
 
    secondStr.foo();
    secondStr.bar();
    secondStr.third();
  
    system("pause");
}
В данном случае две ошибки: ошибка в функции bar(), так как const функция не может менять состояние класса, и при вызове secondStr.foo(), так как secondStr - константный экземпляр класса String. И поэтому есть риск, что если foo() не помечена как const - она может изменить данные у константного объекта, что недопустимо. String::third() скомпилирутся без проблем для обоих экземпляторов класса.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
virtual void Print() const //Вывод данных (Почему virtual и const?)
Почему virtual Вы знаете со своей предыдущей темы, const - с объяснения выше
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
Box(int newWidth = 100, int newHeight = 200, const string& newBorderColor = "Black") //Конструктор с уже установленными значениями
Да. Это значения по умолчанию. Тоесть, Вы можете часть из них не написать при вызове конструктора, как я сделал в классе TextBox, а компилятор присвоит эти значения переменным.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
virtual ~Text() //Вызываем деструктор? Почему?
Не путайте вызов с объявлением. Мы объявляем виртуальный деструктор, чтобы дать возможность дочерним типам возможность его переопределить, тем самим добившись правильной очистки памяти. Здесь деструктор добавлен просто как полезное дополнение, на будущее, он не несёт смысловой нагрузки.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
2
3
4
TextBox()//Конструктор (Добовляем данные двух базовых классов?)
* * :Text(), Box()
{
}
Поскольку TextBox наследуется сразу от двух классов - вызываем их конструкторы. Невозможно существовать ребёнку без родителей А конструкторы как-раз и создают ребёнку TextBox родителей Text и Box.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
void SetTextBox(int size, int data, const string& newColor, const string& newFont, int newWidth, int newHeight, const string& newBorderColor) //Устонавливаем данные от двух базовых классов?
Да.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
void Print() const override //Чуть по подробней про эту функцию можно пожалуйста?
Здесь демонстрируется методика замещения. В каждом из родительских классов для TextBox есть метод Print() и каждый из модификатором virtual, что даёт ребёнку возможность его "заместить" своей функцией. Подобное я Вам демонстрировал в Вашей предыдущей теме.
Но вот в чём парадокс. Представим, что класс TextBox не имеет функции Print(). Родителей на этот раз двое. А функция Print() имеет одинаковое имя и в первого родителя, и во второго. Возникает неоднозначность. Компилятор не знает, с какого же родителя ему вызывать данную функцию.
Но мы можем переопределить функцию Print() для обоих родителей и в ней уже вызвать печать каждого родителя, явно указав, откуда мы какую Print() вызываем.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
~TextBox() override //Почему деструктор с override?
Это позволит ему заместить деструкторы родителей и правильно очистить память, как нужно классу TextBox. В данном случае это просто полезная практика на будущее.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
Text * text = new Text(); //Создаем класс в динамической памяти?
Правильней будет сказать: "выделяем память во время исполнения", но смысл верный.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
text->Print(); //Вывод данных класов?
Да.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
delete text; //Освобождаем динамическую память?
Да. Память, выделенную во время исполнения, а не во время компиляции - обязательно нужно вручную очищать, иначе произойдёт её утечка.
Цитата Сообщение от Sklifasovsky Посмотреть сообщение
C++
1
//Почему не используется return 0;
Функция main() одна со всех функций, которая может себе это позволить. По умолчанию она сама сгенерирует и вернёт 0
1
11 / 1 / 0
Регистрация: 26.11.2018
Сообщений: 61
16.04.2019, 22:15  [ТС]
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
Здесь демонстрируется методика замещения. В каждом из родительских классов для TextBox есть метод Print() и каждый из модификатором virtual, что даёт ребёнку возможность его "заместить" своей функцией. Подобное я Вам демонстрировал в Вашей предыдущей теме.
Но вот в чём парадокс. Представим, что класс TextBox не имеет функции Print(). Родителей на этот раз двое. А функция Print() имеет одинаковое имя и в первого родителя, и во второго. Возникает неоднозначность. Компилятор не знает, с какого же родителя ему вызывать данную функцию.
Но мы можем переопределить функцию Print() для обоих родителей и в ней уже вызвать печать каждого родителя, явно указав, откуда мы какую Print() вызываем.
Просто шикарное объяснение! Каждый комментарий разлаживает все по полочкам. Такие советы и такая помощь мотивирует не сдаваться Огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2019, 22:15
Помогаю со студенческими работами здесь

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

множественное наследование
Мечтаю реализовать такую иерархию human-&gt;employee-&gt;doctor в реализации doctor ругает конструктор. Ошибка 1 error C2062: type 'char'...

Множественное наследование
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц (зарплата и печать). На базе этих классов нужно создать...

Множественное наследование
Добрый день. У меня имеется базовый класс A. У этого класса есть несколько наследников. Есть еще один класс B, который является...

Множественное наследование
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу (O) из класса (С) #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru