Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SanychBY
39 / 46 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
#1

Полиморфизм - C++

05.10.2015, 20:40. Просмотров 263. Ответов 8
Метки нет (Все метки)

Хай
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
class MyPrint//производный класс
{
public:
    MyPrint()
    {
        cout << "Constructor MyPrint" << endl;
    }
    virtual ~MyPrint()
    {
        cout << "Destr MyPrint" << endl;;
    }
    virtual void Pr(void) = 0;//чистая виртуальная функция
};
class RPrint:virtual public MyPrint
{
public:
    RPrint()
    {
        cout << "Constructor Rprint" << endl;
    }
    ~RPrint()
    {
        cout << "Destr RPrint" << endl;
    }
    //virtual void Pr(void);
    virtual void Pr(Rose p)
    {
        cout << "Rose" << endl;
        cout << "Pack - " << p.Pack.GetMaterial() << endl;
        cout << "Color - " << p.GetColor() << endl;
        cout << "Stalk length - " << p.stalk.GetLength() << endl;
        cout << "Stalk - ";
        if (p.stalk.GetThorns())
        {
            cout << "scratchy" << endl;
        }
        else
        {
            cout << "smooth" << endl;
        }
    }
};
class ChrPrint :public MyPrint
{
public:
    ChrPrint()
    {
        cout << "Constructor ChrPrint" << endl;
    }
    ~ChrPrint()
    {
        cout << "Destr ChrPrint" << endl;
    }
    virtual void Pr(Chrys p)
    {
        cout << "Chrysanthemum" << endl;
        cout << "Pack - " << p.Pack.GetMaterial() << endl;
        cout << "Color - " << p.GetColor() << endl;
        cout << "Stalk length - " << p.stalk.GetLength() << endl;
        cout << "Stalk - ";
        if (p.stalk.GetThorns())
        {
            cout << "scratchy" << endl;
        }
        else
        {
            cout << "smooth" << 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
void main()
{
    Rose MyRose;
    MyRose.SetColor("Red");
    MyRose.stalk.SetLength(10);
    MyRose.stalk.SetThornsh(true);
    MyRose.Pack.SetMaterial("Plastick");
    
    Chrys MyChr;
    MyChr.SetColor("White");
    MyChr.stalk.SetLength(20);
    MyChr.stalk.SetThornsh(false);
    MyChr.Pack.SetMaterial("Cartbord");
    cout << "00000000000000000000000000" << endl;
    RPrint rp;//ОШИБКА! использование объекта абстрактного класса типа RPrint не допускается. Чистая виртуальная функция MyPrint::Pr не имеет оператора переопределения
    //MyPrint *PointPrint;
    //PointPrint = new RPrint;
    //PointPrint->Pr(MyRose);
    
 
    cout << "00000000000000000000000000" << endl;
    //PointPrint = new ChrPrint;
    //PointPrint->Pr(MyChr);
    
 
    system("pause");
}
Подскажите, как тут правильно сделать полиморфизм. И правильно я понимаю, что можно утверждать, что происходит переопределение функции Pr? И вообще, в принципе, при полиморфизме происходит переопределение функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2015, 20:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полиморфизм (C++):

С++ и полиморфизм - C++
Здравствуйте. Ответьте пожалуйста на несколько вопросов: 1. Что такое абстрактная функция простыми словами? 2. Что такое...

полиморфизм - C++
Всем привет, изучаю С++ недавно, я новичек в этом языке программирования, читаю про ООП, понял все за исключением полиморфизма, что делает...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...

Полиморфизм - C++
Сколько я не читал книг и уроков по С++-программированию, я так и не смог понять что такое полиморфизм. Можно ли как-то просто и...

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

8
UltraPenguin
229 / 95 / 22
Регистрация: 20.03.2014
Сообщений: 303
Завершенные тесты: 1
05.10.2015, 20:54 #2
Цитата Сообщение от SanychBY Посмотреть сообщение
И правильно я понимаю, что можно утверждать, что происходит переопределение функции Pr?
Да.

C++
1
2
3
4
RPrint * rp = &MyRose; // Нельзя создавать экземпляр абстрактного класса, но можно использовать указатель на абстрактный базовый класс
rp->Pr();
rp = &MyChr;
rp->Pr();
Добавлено через 2 минуты
Кроме того:
C++
1
2
3
4
5
6
7
8
    RPrint() : MyPrint() // Не забываем сконструировать базу
    {
        cout << "Constructor Rprint" << endl;
    }
    virtual ~RPrint()
    {
        cout << "Destr RPrint" << endl;
    }
и то же самое для ChrPrint
0
pav1uxa
1846 / 1698 / 644
Регистрация: 23.01.2014
Сообщений: 6,078
Завершенные тесты: 1
05.10.2015, 20:58 #3
Цитата Сообщение от SanychBY Посмотреть сообщение
И правильно я понимаю, что можно утверждать, что происходит переопределение функции Pr?
В классе MyPrint она выглядит как
C++
1
void Pr(void)
В наследующих ее классах она выглядит как
C++
1
void Pr(Rose p)
Ответ: нет. Это 2 разных метода. Причем первый является чистым виртуальным. Его Вы так же наследуете. Класс с таким методом является абстрактным, экземпляр такого класса создать нельзя.
0
UltraPenguin
229 / 95 / 22
Регистрация: 20.03.2014
Сообщений: 303
Завершенные тесты: 1
05.10.2015, 21:00 #4
Цитата Сообщение от SanychBY Посмотреть сообщение
//virtual void Pr(void);
pav1uxa, я так понимаю ранее было так, а потом автор изменил чтобы код работал или просто при экспериментах. Но если говорить строго то вы правы, сейчас это два разных метода.
0
pav1uxa
1846 / 1698 / 644
Регистрация: 23.01.2014
Сообщений: 6,078
Завершенные тесты: 1
05.10.2015, 21:02 #5
Цитата Сообщение от UltraPenguin Посмотреть сообщение
я так понимаю ранее было так, а потом автор изменил чтобы код работал или просто при экспериментах

Не по теме:

Ага, и откуда же тогда вообще там возьмется p?

1
UltraPenguin
229 / 95 / 22
Регистрация: 20.03.2014
Сообщений: 303
Завершенные тесты: 1
05.10.2015, 21:16 #6
Чуть вернее:
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
class Flower
{
/*дополнительные объявления нужные для всех цветков*/
public:
    Flower()
    {
        cout << "Constructor Flower" << endl;
    }
    virtual ~Flower()
    {
        cout << "Destr Flower" << endl;;
    }
    virtual void Pr(void)
    {
        cout << "Pack - " << Pack.GetMaterial() << endl;
        cout << "Color - " << GetColor() << endl;
        cout << "Stalk length - " << stalk.GetLength() << endl;
        cout << "Stalk - ";
        if (stalk.GetThorns())
        {
            cout << "scratchy" << endl;
        }
        else
        {
            cout << "smooth" << endl;
        }
    }
};
 
class Rose : virtual public Flower
{
/*дополнительные объявления нужные только Rose*/
public:
    Rose() : Flower()
    {
        cout << "Constructor Rose" << endl;
    }
    virtual ~Rose()
    {
        cout << "Destr Rose" << endl;
    }
    virtual void Pr(void)
    {
        cout << "Rose" << endl;
        Flower::Pr();
    }
};
 
class Chrys : public Flower
{
/*дополнительные объявления нужные только Chrys*/
public:
    Chrys() : Flower()
    {
        cout << "Constructor Chrys" << endl;
    }
    virtual ~Chrys()
    {
        cout << "Destr Chrys" << endl;
    }
    virtual void Pr(void)
    {
        cout << "Chrysanthemum" << endl;
        Flower::Pr();
    }
}

Не по теме:

Все пора домой, голова не варит

0
SanychBY
39 / 46 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
05.10.2015, 21:45  [ТС] #7
Моя задача правильно продемонстрировать полиморфизм.
Цитата Сообщение от UltraPenguin Посмотреть сообщение
RPrint * rp = &MyRose;
Строка - бред, выдает ошибку. Причем тут объект MyRose к RPrint?
Цитата Сообщение от pav1uxa Посмотреть сообщение
Ответ: нет. Это 2 разных метода. Причем первый является чистым виртуальным. Его Вы так же наследуете. Класс с таким методом является абстрактным, экземпляр такого класса создать нельзя.
Так в чем разница между переопределением и полиморфизмом (виртуальные функции)? Я могу просто переопределить функцию и все.
Цитата Сообщение от UltraPenguin Посмотреть сообщение
Сообщение от SanychBY
//virtual void Pr(void);
pav1uxa, я так понимаю ранее было так, а потом автор изменил чтобы код работал или просто при экспериментах. Но если говорить строго то вы правы, сейчас это два разных метода.
По сути, я вообще не понимаю значение данной строки, была взята из учебника, потом закоментированна.
Цитата Сообщение от pav1uxa Посмотреть сообщение
Ага, и откуда же тогда вообще там возьмется p?
??????????????????????
Цитата Сообщение от UltraPenguin Посмотреть сообщение
Чуть вернее:
Не трогаем класс цветок

Добавлено через 1 минуту
Вообще, в чем суть полиморфизма (википедию, учебник и просто статьи читал), но так и не понял?

Добавлено через 1 минуту
Цитата Сообщение от SanychBY Посмотреть сообщение
Вообще, в чем суть полиморфизма (википедию, учебник и просто статьи читал), но так и не понял?
Есть базовый класс, содержащий методы. Полиморфизм позволяет изменить пару методов, для работы с конкретными объектами с лишь частично общими чертами?

Добавлено через 30 секунд
Так по-моему это и есть переопределение или перегрузка
0
pav1uxa
1846 / 1698 / 644
Регистрация: 23.01.2014
Сообщений: 6,078
Завершенные тесты: 1
05.10.2015, 22:04 #8
Цитата Сообщение от SanychBY Посмотреть сообщение
Так в чем разница между переопределением и полиморфизмом (виртуальные функции)? Я могу просто переопределить функцию и все.
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
#include <iostream>
 
using namespace std;
 
class A
{
public:
    // виртуальный метод
    virtual void printV()
    {
        cout << "A\n";
    }
    // перегружаемый метод
    void print()
    {
        cout << "A\n";
    }
};
 
class B : public A
{
    // виртуальный метод
    virtual void printV()
    {
        cout << "B\n";
    }
    // перегружаемый метод
    void print()
    {
        cout << "B\n";
    }
};
 
int main()
{
    A *b = new B;
    b->print(); // A
    b->printV(); // B
    return 0;
}
Добавлено через 33 секунды
Цитата Сообщение от SanychBY Посмотреть сообщение
??????????????????????
Это было не Вам, если Вы не заметили...
0
UltraPenguin
229 / 95 / 22
Регистрация: 20.03.2014
Сообщений: 303
Завершенные тесты: 1
05.10.2015, 22:11 #9
Цитата Сообщение от SanychBY Посмотреть сообщение
По сути, я вообще не понимаю значение данной строки, была взята из учебника, потом закоментированна.
Так привели бы исходный текст из учебника. А то не понятно что вы подразумевали изначально.

Полиморфизм это когда у тебя есть N указателей на объекты базового класса (например цветы) и ты можешь вызвать у них одинаковые по своему виду методы, но выполнятся они у каждого объекта по-своему в соответствии с реальным типом. Конкретно в C++ это достигается через наследование и виртуальные методы.

Переопределение и перегрузка это разные вещи. В первом случае две функции с одинаковыми сигнатурами, но с разными алгоритмами, во втором две функции с одинаковым именем, но разными сигнатурами.
0
05.10.2015, 22:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2015, 22:11
Привет! Вот еще темы с ответами:

Полиморфизм c++ - C++
Построить массив из указателей (базового типа) на объекты обоих классов. Выбрать объекты производного класса, отсортировать их и сложить...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

Полиморфизм - C++
Я хотел реализовать множество, используя множественное наследование, но когда написал template &lt;class T&gt; class set { protected: ...

Полиморфизм - C++
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать...


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

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

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