Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
IAmHated
1 / 1 / 1
Регистрация: 27.10.2009
Сообщений: 108
1

Виртуальная функция

08.04.2013, 12:28. Просмотров 655. Ответов 19
Метки нет (Все метки)

Создайте класс Matematica, определите в нем виртуальную функцию-член matem(int x, int y), которая выводит на экран значения параметров. Создайте производные классы Umn и Del с перегруженной функцией matem(int x, int y) для умножения и деления параметров соответственно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 12:28
Ответы с готовыми решениями:

Чистая виртуальная функция функция не имеет оператора переопределения
Пишу программу для записи заметок. Есть 2 класса: Page и Note. Note наследуется...

виртуальная функция
Вот на форуме увидел тему где приводились в пример виртуальные функции..Что это...

Виртуальная функция
В учебнике дается понятие абстрактного класса, как класса содержащего хоть одну...

Виртуальная функция
Всем доброго времени суток! Прошу помочь с одной проблемой. Собственно, вот...

виртуальная функция
class B { private: int a; int b; public: virtual void show();//есть...

19
Nuqlear
5 / 5 / 1
Регистрация: 05.11.2011
Сообщений: 17
08.04.2013, 12:55 2
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
#include <iostream>
#include <math.h>
using namespace std;
 
class Matematica
{
public:
    virtual void matem(int x, int y)
    {
        cout << x << " " << y << endl;
    }
};
 
class Umn: public Matematica
{
public:
    void matem(int x, int y)
    {
        cout << x * y << endl;
    }
};
 
class Del: public Matematica
{
public:
    void matem(int x, int y)
    {
        cout << x / y << endl;
    }
};
 
int main()    
{
    Matematica *x=new Matematica();
    x->matem(5,4);
    delete x;
    x=new Umn();
    x->matem(5,4);
    delete x;
    x=new Del();
    x->matem(5,4);
    delete x;
}
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.04.2013, 12:58 3
Nuqlear, Деструктор у базового класса должен быть виртуальный, иначе UB.
0
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 13:00 4
Цитата Сообщение от Nuqlear Посмотреть сообщение
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
#include <iostream>
#include <math.h>
using namespace std;
 
class Matematica
{
public:
    virtual void matem(int x, int y)
    {
        cout << x << " " << y << endl;
    }
};
 
class Umn: public Matematica
{
public:
    void matem(int x, int y)
    {
        cout << x * y << endl;
    }
};
 
class Del: public Matematica
{
public:
    void matem(int x, int y)
    {
        cout << x / y << endl;
    }
};
 
int main()    
{
    Matematica *x=new Matematica();
    x->matem(5,4);
    delete x;
    x=new Umn();
    x->matem(5,4);
    delete x;
    x=new Del();
    x->matem(5,4);
    delete x;
}
обьясните пожалуйста для чего нужны виртуальные функции.
1
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 13:33 5
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
#include <iostream>
 
class Matematica
{
public:
    Matematica() {}
    Matematica(const Matematica&) {}
    virtual ~Matematica() {}
 
    virtual void matem(int x, int y) { std::cout << "x: "
        << x << "; y: " << y << '\n'; }
};
 
class Umn : public Matematica
{
public:
    Umn() {}
    Umn(const Matematica&) {}
    ~Umn() {}
 
    void matem(int x, int y) { std::cout << "x * y = " << x * y << '\n'; }
};
 
class Del : public Matematica
{
public:
    Del() {}
    Del(const Del&) {}
    ~Del() {}
 
    void matem(int x, int y) { std::cout << "x / y = " << x / y << '\n'; }
};
 
int main()
{
    Matematica* b_ptr, m_obj;
    Umn u_obj;
    Del d_obj;
 
    b_ptr = &m_obj;
    b_ptr->matem(6, 2);
 
    b_ptr = &u_obj;
    b_ptr->matem(6, 2);
 
    b_ptr = &d_obj;
    b_ptr->matem(6, 2);
 
    return 0;
}
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.04.2013, 13:45 6
xtorne21st, Конструкторы копирования да и деструкторы везде кроме базового класса нафиг не нужны ( а в базовом стоит оставить только деструктор, да фукнцию ).
0
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 13:48 7
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
    Umn() {}
    Umn(const Matematica&) {}
    ~Umn() 
//....
    Del() {}
    Del(const Del&) {}
    ~Del() {}
}
а почему используется два конструктора, а не один?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 13:50 8
programina, Виртуальные функции нужны для позднего связывания.

Добавлено через 2 минуты
Второй конструктор, который принимает константную ссылку на объект такого же класса, это конструктор копирования.
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.04.2013, 13:59 9
Пример можно порезать и сделать несколько короче.

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
#include <iostream>
 
class Matematica
{
public:
    virtual ~Matematica() {}
 
    virtual void matem(int x, int y) { std::cout << "x: "
        << x << "; y: " << y << '\n'; }
};
 
class Umn : public Matematica
{
public: 
    void matem(int x, int y) { std::cout << "x * y = " << x * y << '\n'; }
};
 
class Del : public Matematica
{
public:
    void matem(int x, int y) { std::cout << "x / y = " << x / y << '\n'; }
};
 
void invoke(Matematica* m, int x, int y)
{
   m->matem(x, y);
}
 
int main()
{
    Matematica m_obj;
    Umn u_obj;
    Del d_obj;
    invoke(&m_obj, 6, 2);
    invoke(&u_obj, 6, 2);
    invoke(&d_obj, 6, 2);
 
    return 0;
}
2
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:00 10
ForEveR, ну это я для того сделал, чтоб явно указать что "ничего не напутал и не забыл". и можете пожалуйста расшифровать аббревиатуру UB.
0
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:00 11
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, Виртуальные функции нужны для позднего связывания.
то есть для того чтобы программа во время исполнения определяла какую операцию нужно выполнить, поделить или умножить?
Если да, то зачем, ведь можно сделать две разные функции для умножения и деления?
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.04.2013, 14:01 12
xtorne21st, undefined behaviour, ака неопределенное поведение.
1
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:03 13
ForEveR, ну и если на то пошло виртуальный деструктор конкретно в этом примере тоже вещь опциональная
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.04.2013, 14:04 14
xtorne21st, Конкретно в данном - да. Согласен.)
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 14:04 15
programina, почитайте про полиморфизм
1
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:07 16
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, почитайте про полиморфизм
Я еще не дошла до ООП парадигмы
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:09 17
programina, Виртуальные функции нужны 1) для того, чтобы во время выполнения программы (да и не только) если имеется указатель на базовый класс и он ссылается на объект выведенный из базового класса программа могла определить тип объекта не по типу указателя, а по самому объекту, на который ссылается указатель. 2) для того, чтобы использовать одно имя для различных объектов (полиморфизм).
1
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 14:12 18
programina, В любом случае, когда разберетесь с наследованием и полиморфизмом, виртуальные функции станут для Вас понятны. А если сможете еще имитировать полиморфизм руками, то совсем станет все прозрачно.
1
programina
2052 / 607 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 19:10 19
xtorne21st, плохо понятно, но всеравно спасибо

Добавлено через 4 часа 29 минут
Кажется, до меня дошло, это нужно для того чтобы применять к разным объектам методы с одинаковыми названиями (абстракция ешкин кот)
Например:
Есть человек и собака, которые хотят кушать.
C++
#include <iostream>
 
class СУЩЕСТВО
{
    public:
        virtual void покормить() { cout << "никто не кушает" << endl; }
};
 
class ЧЕЛОВЕК : public СУЩЕСТВО
{
    public:
        void покормить() { cout << "человек кушает борщ" << endl; }
};
 
class СОБАКА : public СУЩЕСТВО
{
    public:
        void покормить() { cout << "собака кушает педигри" << endl; }
};
 
int main()
{
    СУЩЕСТВО *кто;
    СУЩЕСТВО  существо;
    ЧЕЛОВЕК   человек;
    СОБАКА    собака;
 
    кто = &существо;    // существо
    кто -> покормить(); // никто не кушает
 
    кто = &человек;     // человек
    кто -> покормить(); // кушает борщ
 
    кто = &собака;      // собака
    кто -> покормить(); // кушает педигри
 
    return 0;
}
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 19:37 20
Довольно доходчивое разъяснение.
0
08.04.2013, 19:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 19:37

Виртуальная функция
Ругается на метод virtual bool isOveersize() из класса publication. Что не так...

Виртуальная функция
Создать производный класс Trapez(равнобокая трапеция). Определить в классе...

Виртуальная функция, полиморфизм
Добавить виртуальную функцию.Продемонстрировать полиморфизм. #include...


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

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

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