Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2667 / 1188 / 158
Регистрация: 28.10.2011
Сообщений: 4,264
Записей в блоге: 6
1

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

06.05.2013, 20:05. Просмотров 943. Ответов 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;
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2013, 20:05
Ответы с готовыми решениями:

не работат с циклом
switch ($_GET){ default: echo'&lt;a href=&quot;news.php?act=add&quot;&gt;Добавить Новость&lt;/a&gt;&lt;br&gt;'; $all =...

Работат с uintmax_t
Microsoft Visual Studio 2008 возвращает размер файла в байтах: uintmax_t file_size(const path&amp;...

Выпадающий список не работат
Доброго времени суток! Помогите пожалуйста с выпадающим списком( который совсем не работает). У...

Алгоритм Вычисления числа пи не работат(не домашка).
Почему то при вычислении получаются только нули. using System; using System.Collections.Generic;...

5
CEO SOVAZ Corp.
384 / 230 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
06.05.2013, 20:07 2
void fn(My& z); - может из-за этого (хотя не знаю)
0
Ушел с форума
Эксперт С++
16308 / 7376 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 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 минуты
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
3
2667 / 1188 / 158
Регистрация: 28.10.2011
Сообщений: 4,264
Записей в блоге: 6
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;
};
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.05.2013, 21:00 5
Цитата Сообщение от Убежденный Посмотреть сообщение
И в классах, которые удаляются через полиморфную базу, обязательно должен
быть виртуальный деструктор.
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
0
Ушел с форума
Эксперт С++
16308 / 7376 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
06.05.2013, 23:11 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Если в конструкторе дочернего класса нет захвата ресурсов, требующих освобождения, то деструктору не зачем быть виртуальным. Можно даже использовать версию, предоставляемую системой по умолчанию.
Вы не правы.
Полиморфное удаление класса, не имеющего виртуального деструктора - это undefined behavior.
По стандарту (ISO-14882, 5.3.5, пункт 3).
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 23:11

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

Работат с листом листов (List<List<double>>)
Имеет ли смысл такая конструкция List&lt;List&lt;double&gt;&gt;? Экземпляр-то создается, но немного подвис я,...

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

Полиморфизм
дана программа class X { int i; public X() { i = 5; this.print(); } public void...

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


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

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

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