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

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

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

виртуальная функция C++
Виртуальная функция C++
C++ виртуальная функция
C++ Виртуальная функция не хочет перекрываться
Чистая виртуальная функция C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nuqlear
5 / 5 / 0
Регистрация: 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.04.2013, 12:58     Виртуальная функция #3
Nuqlear, Деструктор у базового класса должен быть виртуальный, иначе UB.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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;
}
обьясните пожалуйста для чего нужны виртуальные функции.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.04.2013, 13:45     Виртуальная функция #6
xtorne21st, Конструкторы копирования да и деструкторы везде кроме базового класса нафиг не нужны ( а в базовом стоит оставить только деструктор, да фукнцию ).
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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() {}
}
а почему используется два конструктора, а не один?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 13:50     Виртуальная функция #8
programina, Виртуальные функции нужны для позднего связывания.

Добавлено через 2 минуты
Второй конструктор, который принимает константную ссылку на объект такого же класса, это конструктор копирования.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:00     Виртуальная функция #10
ForEveR, ну это я для того сделал, чтоб явно указать что "ничего не напутал и не забыл". и можете пожалуйста расшифровать аббревиатуру UB.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:00     Виртуальная функция #11
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, Виртуальные функции нужны для позднего связывания.
то есть для того чтобы программа во время исполнения определяла какую операцию нужно выполнить, поделить или умножить?
Если да, то зачем, ведь можно сделать две разные функции для умножения и деления?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.04.2013, 14:01     Виртуальная функция #12
xtorne21st, undefined behaviour, ака неопределенное поведение.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:03     Виртуальная функция #13
ForEveR, ну и если на то пошло виртуальный деструктор конкретно в этом примере тоже вещь опциональная
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.04.2013, 14:04     Виртуальная функция #14
xtorne21st, Конкретно в данном - да. Согласен.)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 14:04     Виртуальная функция #15
programina, почитайте про полиморфизм
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:07     Виртуальная функция #16
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, почитайте про полиморфизм
Я еще не дошла до ООП парадигмы
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:09     Виртуальная функция #17
programina, Виртуальные функции нужны 1) для того, чтобы во время выполнения программы (да и не только) если имеется указатель на базовый класс и он ссылается на объект выведенный из базового класса программа могла определить тип объекта не по типу указателя, а по самому объекту, на который ссылается указатель. 2) для того, чтобы использовать одно имя для различных объектов (полиморфизм).
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
08.04.2013, 14:12     Виртуальная функция #18
programina, В любом случае, когда разберетесь с наследованием и полиморфизмом, виртуальные функции станут для Вас понятны. А если сможете еще имитировать полиморфизм руками, то совсем станет все прозрачно.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 19:37     Виртуальная функция
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 19:37     Виртуальная функция #20
Довольно доходчивое разъяснение.
Yandex
Объявления
08.04.2013, 19:37     Виртуальная функция
Ответ Создать тему
Опции темы

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