Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 15.07.2013
Сообщений: 19

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

02.12.2013, 09:41. Показов 964. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных функциях берет числа из мусора.
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
51
52
53
54
55
56
57
58
59
60
61
#include <iostream.h>
#include <conio.h>
class convert
{
protected:
double d;
public:
convert(double d1);
convert();
double vozvrat();
virtual void perevod()
{
cout<<d<<" metrov="<<d*100<<" cantimetrov"<<endl;
cout<<d<<" metrov="<<d*1000<<" milimetrov"<<endl;
}};
 
class convert2: public convert
{
public:
virtual void perevod()
{
cout<<d<<" metrov="<<d/1000.0<<" kilometrov"<<endl;
}
};
 
class convert3: public convert
{
public:
 
virtual void perevod()
{
cout<<d<<" metrov="<<d*0.7112<<" arshin"<<endl;
}
};
 
double convert::vozvrat()
{ return d;}
 
convert::convert (double d1)
{d=d1;}
 
convert::convert()
{};
 
void main()
{
double q;
cout<<"vvedite  dliny v metrah"<<endl;
cin>>q;
convert *t;
convert b(q);
convert2 a;
convert3 s;
t=&b;
t->perevod();
t=&a;
t->perevod();
t=&s;
t->perevod();
getch();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2013, 09:41
Ответы с готовыми решениями:

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include &lt;iostream&gt; using...

Виртуальные функции
Какие происходят изменения, когда в классе объявляем одну или несколько функций виртуальными? Вот, например, если в SuperClass перед...

Виртуальные функции
Если в базовом классе А есть виртуальная функция show() перегруженная, то есть имеется три разные версии этой функции. Есть класс Б...

11
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
02.12.2013, 09:50
В конструкторе инициализируйте внутреннюю переменную и не будет хлама:
C++
1
2
3
4
5
6
7
8
9
10
class convert
 {
 protected:
 double d;
 public:
 convert(double d1): d(d1)
 {}
 convert(): d(0)
 {}
...
Не понятен вопрос:
как передать переменную из одной виртуальной функции в другую
Что вообще под этим подразумевается? В коде ничего похожего не увидел.
0
1 / 1 / 1
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 09:56  [ТС]
мне надо передать переменную мою q в другие классы то есть чтобы в conver2 и convert3 тоже использовалась число переменной q
0
81 / 80 / 9
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 10:00
Объекты a и s не проинициализированы, поэтому и мусор получаешь .
Может конструктор создать, который бы принимал класс типа convert.
ну или как вариант статическое поле завести.
0
1 / 1 / 1
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 10:02  [ТС]
то есть мне надо указывать как обычную функцию их? тогда какой смысл от виртуальной функции?
Поля мы еще не проходили
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
02.12.2013, 10:17
Мне кажется, Вы не совсем понимаете смысл наследования.
Производный класс содержит ВСЕ методы и данные(поля) базового класса.
Т.е. переменная d там уже есть.
Нюанс в том, что Вы забыли написать конструкторы производных классов,
которые в свою очередь обязаны вызывать конструктор базового класса.
Виртуальная функция нужна для того, чтобы она делала что-то такое,
чего не может сделать функция базового класса (но вызываться она
должна из кода, который не знает о структуре производного класса.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
02.12.2013, 10:18
Цитата Сообщение от mirozdan Посмотреть сообщение
мне надо передать переменную мою q в другие классы то есть чтобы в conver2 и convert3 тоже использовалась число переменной q
Создайте конструктор копирования и инициализируйте

C++
1
2
3
4
5
6
7
8
9
...
convert(const convert& con)
{
    d = con.d;
}
...
convert b(q);
convert2 a(b);
convert3 s(b);
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
02.12.2013, 10:25
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
#include <iostream>
using namespace std;
class convert
{
protected:
double d;
public:
    convert(double d1):d(d1){}
    convert():d(0){}
    virtual void perevod()
    {
        cout<<d<<" metrov="<<d*100<<" cantimetrov"<<endl;
        cout<<d<<" metrov="<<d*1000<<" milimetrov"<<endl;
    }
};
class convert2: public convert
{
private:
    double mnozhitel;
public:
    convert2():convert(),mnozhitel(1){}
    convert2(double d1,double m1):convert(d1),mnozhitel(m1){} //конструктор производного класса вызывает конструктор базового класса
    void perevod()
    {
        cout<<d<<" metrov="<<d*mnozhitel<<" converted units"<<endl;
    }
};
 
void main()
{
    double q;
    cout<<"vvedite dliny v metrah"<<endl;
    cin>>q;
    convert *t;
    convert b(q);
    convert2 a(q,0.1);
    t=&b; // Инициализируем указатель базового класса адресом базового класса 
    t->perevod(); // вызывается виртуальный метод из базового класса 
    t=&a;  // Инициализируем указатель базового класса адресом производного класса
    t->perevod(); // вызывается виртуальный метод из производного класса
    system("pause");
}
1
81 / 80 / 9
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 10:35
Вот моя капля дегтя в бочку с медом, суть не меняется, надо просто инициализировать, то что создаешь
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class convert
{
protected:
    double d;
public:
    convert(double d1);
    convert();
    double vozvrat();
    virtual void perevod()
    {
        cout<<d<<" metrov="<<d*100<<" cantimetrov"<<endl;
        cout<<d<<" metrov="<<d*1000<<" milimetrov"<<endl;
    }
};
 
class convert2: public convert
{
public:
    convert2(double d1):convert(d1){ }
 
    virtual void perevod()
    {
        cout<<d<<" metrov="<<d/1000.0<<" kilometrov"<<endl;
    }
};
 
class convert3: public convert
{
public:
    convert3(double d1):convert(d1){}
 
    virtual void perevod()
    {
        cout<<d<<" metrov="<<d*0.7112<<" arshin"<<endl;
    }
};
 
double convert::vozvrat()
{
    return d;
}
 
convert::convert (double d1):d(d1)
{
 
}
 
convert::convert() {}
 
int main()
{
    double q;
    cout<<"vvedite dliny v metrah"<<endl;
    cin>>q;
    convert *t;
    convert b(q);
    convert2 a(q);
    convert3 s(q);
    t=&b;
    t->perevod();
    t=&a;
    t->perevod();
    t=&s;
    t->perevod();
    getch();
    return 0;
}
1
1 / 1 / 1
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 10:38  [ТС]
Спасибо вам большое! Только я так и не понял какая разница виртуальных от обычных функций потомков? Только имя остается и все?
0
81 / 80 / 9
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 10:51
Читай про полиморфизм.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
02.12.2013, 11:03
Цитата Сообщение от mirozdan Посмотреть сообщение
какая разница виртуальных от обычных функций потомков?
t=&b; // Инициализируем указатель базового класса адресом базового класса
t->perevod(); // вызывается виртуальный метод из базового класса
t=&a; // Инициализируем указатель базового класса адресом производного класса
t->perevod(); // вызывается виртуальный метод из производного класса хотя и используем тот же самый указатель базового класса
b.perevod(); // вызывается метод из базового класса обычным способом
a.perevod(); // вызывается из производного класса обычным способом
a.convert: : perevod(); // вызывается из базового класса (там двойное двоеточие) обычным способом

Добавлено через 5 минут
Еще можете добавить невиртуальный метод и посмотреть, что в двух первых случаях будет вызываться метод из базового класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2013, 11:03
Помогаю со студенческими работами здесь

Виртуальные функции
Здрасте! вот задачка, какбэ сделал, но нужны виртуальные функции. даже не знаю как их сделать. #include &lt;iostream.h&gt; ...

Виртуальные функции
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; using namespace std; class Array { ...

Виртуальные функции
Объясните, для чего необходимы виртуальные функции. Где их рационально использовать. P.S. Если есть ссылки на толковые материалы - не...

Виртуальные функции
Объясните пожалуйста зачем нужны чисто виртуальные функции?

Виртуальные функции
Создать базовый класс «молодой человек» и производные классы «студент», «военнослужащий», «военный курсант». Выведите на экран сведения о...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru