Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
locm
1988 / 743 / 72
Регистрация: 28.10.2011
Сообщений: 2,169
Записей в блоге: 2
#1

Не работат полиморфизм - C++

06.05.2013, 20:05. Просмотров 314. Ответов 5
Метки нет (Все метки)

Почему при запуске этого кода, в консоли две четверки? Если верить книге в которой был похожий пример, должно быть 4, а затем 20.
Компилятор MinGW.
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 <cstdlib>
#include <iostream>
 
using namespace std;
 
class My
{
      public:
            int funct()
            {
                return 4;
            }
};
 
class Test : public My
{
      public:
             int funct()
             {
                return 20;
             }
};
 
 
void fn(My& z)
{
     cout << z.funct()<<"\n";
};
 
 
int main(int argc, char *argv[])
{
 
    My y;
    Test x;
    fn(y);
    fn(x);
    system("PAUSE");
    return EXIT_SUCCESS;
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 20:05     Не работат полиморфизм
Посмотрите здесь:

Полиморфизм :( - C++
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает...

Полиморфизм - C++
полиморфизм runtime vs compile polymorphism: как вы на проектах определяете, когда стоит пользоваться шаблоном, а когда...

Полиморфизм - C++
Имеется такая задача Создать абстрактный базовый класс Integer (целое) с виртуальными арифметическими операциями и функцией вывода на...

Полиморфизм - C++
Вот сделал прогу а ее надо было сделать полиморфизмом - кому несложно переделайте #include &lt;iostream.h&gt; #include &lt;conio.h&gt; ...

Полиморфизм - C++
Прочитал в Википедии что такое полиморфизм: Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». ...

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

ох уж этот полиморфизм - C++
Добрый день. имеются классы: class element {...} class tableProcedure : public element {...} Проблема в следующем: имеется...

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

Наследование и полиморфизм... - C++
Есть спецы в этой теме?) Сейчас пишу курсовую, в методичке (препод сильно снижает за отклонения от инструкций) сказано создать базовый...

Operator= и полиморфизм - C++
Написал код, который работает, но я не могу понять как. Особенно сильно волнует, что происходит в строке 58... #include &lt;iostream&gt; ...

ООП. Полиморфизм - C++
Мальчики, учусь на МехМате. Для сдачи зачёта по ООП необходимо написать последнюю программу: Задание: полиморфизм Указание: во всех...

Полиморфизм и деструктор - C++
Данный код является полиморфизмом? #include &lt;iostream&gt; using namespace std; class ABC { public: virtual void Print() { ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
06.05.2013, 20:07     Не работат полиморфизм #2
void fn(My& z); - может из-за этого (хотя не знаю)
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
06.05.2013, 20:14     Не работат полиморфизм #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вы забыли указать virtual в объявлении метода в базовом классе.
Это во-первых. А во-вторых, полиморфизм работает лишь тогда,
когда метод вызывается через указатель или ссылку на базовый класс.

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
#include <iostream>
 
class parent
{
public:
    virtual void show()
    {
        std::cout << "I am parent" << std::endl;
    }
 
    virtual ~parent() {}
};
 
class child : public parent
{
public:
    void show()
    {
        std::cout << "I am child" << std::endl;
    }
};
 
int main()
{
    parent *pParent = new child();
    pParent->show();
    delete pParent;
    return 0;
}
> "I am child"
Добавлено через 4 минуты
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
locm
1988 / 743 / 72
Регистрация: 28.10.2011
Сообщений: 2,169
Записей в блоге: 2
06.05.2013, 20:23  [ТС]     Не работат полиморфизм #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
36
37
38
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class My
{
      public:
            virtual int funct()
            {
                return 4;
            }
};
 
class Test : public My
{
      public:
             int funct()
             {
                return 20;
             }
};
 
 
void fn(My& z)
{
     cout << z.funct()<<"\n";
};
 
int main(int argc, char *argv[])
{
    My y;
    Test x;
    fn(y);
    fn(x);
    system("PAUSE");
    return EXIT_SUCCESS;
};
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 21:00     Не работат полиморфизм #5
Цитата Сообщение от Убежденный Посмотреть сообщение
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
06.05.2013, 23:11     Не работат полиморфизм #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Вы не правы.
Полиморфное удаление класса, не имеющего виртуального деструктора - это undefined behavior.
По стандарту (ISO-14882, 5.3.5, пункт 3).
Yandex
Объявления
06.05.2013, 23:11     Не работат полиморфизм
Ответ Создать тему
Опции темы

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