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

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

Войти
Регистрация
Восстановить пароль
 
locm
1948 / 703 / 67
Регистрация: 28.10.2011
Сообщений: 2,074
Записей в блоге: 2
#1

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

06.05.2013, 20:05. Просмотров 303. Ответов 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++
Полиморфизм C++
Полиморфизм :( C++
C++ Полиморфизм
C++ Полиморфизм
Полиморфизм c++ C++
Полиморфизм C++
C++ Полиморфизм
Полиморфизм C++
Полиморфизм C++
C++ Полиморфизм

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
06.05.2013, 20:07     Не работат полиморфизм #2
void fn(My& z); - может из-за этого (хотя не знаю)
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 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
1948 / 703 / 67
Регистрация: 28.10.2011
Сообщений: 2,074
Записей в блоге: 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
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.05.2013, 21:00     Не работат полиморфизм #5
Цитата Сообщение от Убежденный Посмотреть сообщение
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
06.05.2013, 23:11     Не работат полиморфизм #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Вы не правы.
Полиморфное удаление класса, не имеющего виртуального деструктора - это undefined behavior.
По стандарту (ISO-14882, 5.3.5, пункт 3).
Yandex
Объявления
06.05.2013, 23:11     Не работат полиморфизм
Ответ Создать тему
Опции темы

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