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

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

Восстановить пароль Регистрация
 
locm
1899 / 654 / 64
Регистрация: 28.10.2011
Сообщений: 1,980
Записей в блоге: 2
06.05.2013, 20:05     Не работат полиморфизм #1
Почему при запуске этого кода, в консоли две четверки? Если верить книге в которой был похожий пример, должно быть 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
379 / 225 / 2
Регистрация: 17.12.2011
Сообщений: 816
Записей в блоге: 1
06.05.2013, 20:07     Не работат полиморфизм #2
void fn(My& z); - может из-за этого (хотя не знаю)
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 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
1899 / 654 / 64
Регистрация: 28.10.2011
Сообщений: 1,980
Записей в блоге: 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.05.2013, 21:00     Не работат полиморфизм #5
Цитата Сообщение от Убежденный Посмотреть сообщение
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
06.05.2013, 23:11     Не работат полиморфизм #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Вы не правы.
Полиморфное удаление класса, не имеющего виртуального деструктора - это undefined behavior.
По стандарту (ISO-14882, 5.3.5, пункт 3).
Yandex
Объявления
06.05.2013, 23:11     Не работат полиморфизм
Ответ Создать тему
Опции темы

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