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

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

Войти
Регистрация
Восстановить пароль
 
IAmHated
1 / 1 / 0
Регистрация: 27.10.2009
Сообщений: 108
#1

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

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

Создайте класс 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++
Создать производный класс Trapez(равнобокая трапеция). Определить в классе наследнике: -перегруженные функции для изменения сторон ...

Виртуальная функция - C++
Всем доброго времени суток! Прошу помочь с одной проблемой. Собственно, вот программа: #include <iostream> #include <conio.h> ...

виртуальная функция - C++
Вот на форуме увидел тему где приводились в пример виртуальные функции..Что это такое?И чем они различаются от обычных функций?

Виртуальная функция - C++
В учебнике дается понятие абстрактного класса, как класса содержащего хоть одну виртуальную функцию. Проблема в том, что я так и не...

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

Виртуальная функция - C++
Ругается на метод virtual bool isOveersize() из класса publication. Что не так ? #include "stdafx.h" #include <string> #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 12:58     Виртуальная функция #3
Nuqlear, Деструктор у базового класса должен быть виртуальный, иначе UB.
programina
1914 / 599 / 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
интересующийся
303 / 274 / 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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 13:45     Виртуальная функция #6
xtorne21st, Конструкторы копирования да и деструкторы везде кроме базового класса нафиг не нужны ( а в базовом стоит оставить только деструктор, да фукнцию ).
programina
1914 / 599 / 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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
08.04.2013, 13:50     Виртуальная функция #8
programina, Виртуальные функции нужны для позднего связывания.

Добавлено через 2 минуты
Второй конструктор, который принимает константную ссылку на объект такого же класса, это конструктор копирования.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:00     Виртуальная функция #10
ForEveR, ну это я для того сделал, чтоб явно указать что "ничего не напутал и не забыл". и можете пожалуйста расшифровать аббревиатуру UB.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:00     Виртуальная функция #11
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, Виртуальные функции нужны для позднего связывания.
то есть для того чтобы программа во время исполнения определяла какую операцию нужно выполнить, поделить или умножить?
Если да, то зачем, ведь можно сделать две разные функции для умножения и деления?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 14:01     Виртуальная функция #12
xtorne21st, undefined behaviour, ака неопределенное поведение.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:03     Виртуальная функция #13
ForEveR, ну и если на то пошло виртуальный деструктор конкретно в этом примере тоже вещь опциональная
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 14:04     Виртуальная функция #14
xtorne21st, Конкретно в данном - да. Согласен.)
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
08.04.2013, 14:04     Виртуальная функция #15
programina, почитайте про полиморфизм
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 14:07     Виртуальная функция #16
Цитата Сообщение от Croessmah Посмотреть сообщение
programina, почитайте про полиморфизм
Я еще не дошла до ООП парадигмы
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.04.2013, 14:09     Виртуальная функция #17
programina, Виртуальные функции нужны 1) для того, чтобы во время выполнения программы (да и не только) если имеется указатель на базовый класс и он ссылается на объект выведенный из базового класса программа могла определить тип объекта не по типу указателя, а по самому объекту, на который ссылается указатель. 2) для того, чтобы использовать одно имя для различных объектов (полиморфизм).
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
08.04.2013, 14:12     Виртуальная функция #18
programina, В любом случае, когда разберетесь с наследованием и полиморфизмом, виртуальные функции станут для Вас понятны. А если сможете еще имитировать полиморфизм руками, то совсем станет все прозрачно.
programina
1914 / 599 / 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++
Добавить виртуальную функцию.Продемонстрировать полиморфизм. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Чистая виртуальная функция - C++
Скажите, может ли чистая виртуальная функция иметь тело? В книге написано что может, но не написано как. Пытался сам определить по-разному...

Виртуальная функция и возвращаемое значение - C++
Этот код нужен для разбора арифметических выражений. Пишем что-то типа &quot;1,456+654,5*65.45&quot;, после чего в стек помещаются числа типа float и...

Виртуальная функция не хочет перекрываться - C++
Возникла следующая ситуация, имеется базовый класс с виртуальной функцией, и два производных один с ним в одном файле, другой в соседнем, в...


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

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

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