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

Как правильно реализовать полиморфизм?

27.12.2015, 23:10. Показов 361. Ответов 4
Метки нет (Все метки)

Имеется такая иерархия классов

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
//classes.h
class CL1
{
private:
        int x;
        virtual char c;
 
public:
       CL1();
       int GetX();
       void SetX(int);
       virtual ShowChar();
};
 
class CL2: virtual public CL1
{
private:
        int y;
        char c;        
public:
        CL2();
        int GetY();
        void SetY(int);     
};    
 
class CL3: virtual public CL2
{
private:
        int z;
        char c;        
public:
        CL3();
        int GetZ();
        void SetZ(int);     
};
Имеется такая реализация этих классов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//classes.cpp
#include <iostream>
using namespace std;
 
#include "expclasses1.h"
 
CL1::CL1(){x=1;c='1';}
int CL1::GetX(){return x;}
void CL1::SetX(int NewX){x=NewX;}
void CL1::ShowChar(){cout << "Simbol is " << c << "\n";}
 
CL2::CL2():CL1() {y=10;c='2';}
int CL2::GetY(){return y;}
void CL2::SetY(int NewY){y=NewY;}
 
CL3::CL3():CL2(){z=5;c='3';}
int CL3::GetZ(){return z;}
void CL3::SetZ(int NewZ){z=NewZ;}
Имеется такая программа, использующая этот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
#include "expclasses1.h"
 
int main(int argc, char*argv[])
{
    CL1 c1;
    CL2 c2;
    CL3 c3;
    cout << "For c1 x = " << c1.GetX() << "\n";
    c1.ShowChar();
    cout << "For c2 x = " << c2.GetX() << " y = " << c2.GetY() << "\n";
    c2.ShowChar();
    cout << "For c3 x = " << c3.GetX() << " y = " << c3.GetY() << " z = "<< c3.GetZ() << "\n";
    c3.ShowChar();
        
    system("pause");
    return 0;
}
Результат: с наследованием - нормально, каждая переменная, не описанная в наследованном классе, берется из родительского класса и выводится на экран. Но вот переменная
C++
1
c
статически переписывается для каждого подкласса и отличается. Это своего рода полиморфизм для переменной. Почему метод ShowChar() выдает всегда значение - 1 переменной
C++
1
c
для первого класса, а не разные значения - для CL2 и CL3? Если приведете пример такой же - для функции, а не переменной - тоже спасибо. Только плиз без разных лишних закорючек, динамических полиморфизмов, указателей, ссылок и т.д.... поскольку есть желание разобраться, а не запутаться сильнее.
0

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

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

Полиморфизм С++ - реализовать текстовую игру
Кто решал задачку на полиморфизм такого плана: класс воины -от них наследники разные типы воинов и...

Реализовать иерархию классов (использовать наследование, полиморфизм, виртуальные функции)
Первый базовый класс – млекопитающие; поля – способ питания, вес, среда обитания. Во втором базовом...

Как правильно реализовать класс?
Вопрос первый при реализации классов на java, я для каждого класса создавал новый файл, как это...

Как правильно реализовать множественное наследование?
Всем привет. Нужна помощь. Вот смотрите. Имеется простой класс. От него порождаются два...

4
801 / 531 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
27.12.2015, 23:22 2
C++
1
virtual ShowChar();
Что это за метод такой без возвращаемого значения?

C++
1
virtual char c;;
Виртуальное поле класса?
1
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 129
28.12.2015, 11:05  [ТС] 3
Как это без возвращаемого?...
C++
1
void CL1::ShowChar(){cout << "Simbol is " << c << "\n";}
0
801 / 531 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
28.12.2015, 11:34 4
ну а в прототипе метода базового класса он(возвращаемый тип) ведь не указан.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//classes.h
class CL1
{
private:
        int x;
        virtual char c;
 
public:
       CL1();
       int GetX();
       void SetX(int);
       virtual ShowChar();
};
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,820
28.12.2015, 12:46 5
xlxndr, попытайтесь вникнуть в посты, что вам помогают. У вас репутация выше чем количество сообщений, и вам тут с радостью помогут. Но пытайтесь не отвергать полезные посты)))

http://rextester.com/MYKCS2965
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2015, 12:46

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как правильно реализовать обобщённый класс?
хочу создать класс class MyGenericClass&lt;T&gt; Ругается на эту T. убрать не вариант,нужна дальше

Как правильно реализовать инициализацию массива функцией?
Здравствуйте! Мне нужно что бы вся инициализация массива происходила в отдельной функции и что бы...

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

Как правильно реализовать чтение данных из текстового файла?
char buff; ifstream sho; sho.open(&quot;Мафіни.txt&quot;); if (!sho.is_open()) { cout &lt;&lt;...


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

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

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