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

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

Восстановить пароль Регистрация
 
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 16
02.12.2013, 09:41     Виртуальные функции #1
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных функциях берет числа из мусора.
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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 09:41     Виртуальные функции
Посмотрите здесь:

C++ Виртуальные функции
C++ Виртуальные функции
виртуальные функции C++
Виртуальные функции C++
C++ Виртуальные функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
02.12.2013, 09:50     Виртуальные функции #2
В конструкторе инициализируйте внутреннюю переменную и не будет хлама:
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)
 {}
...
Не понятен вопрос:
как передать переменную из одной виртуальной функции в другую
Что вообще под этим подразумевается? В коде ничего похожего не увидел.
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 16
02.12.2013, 09:56  [ТС]     Виртуальные функции #3
мне надо передать переменную мою q в другие классы то есть чтобы в conver2 и convert3 тоже использовалась число переменной q
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
02.12.2013, 10:00     Виртуальные функции #4
Объекты a и s не проинициализированы, поэтому и мусор получаешь .
Может конструктор создать, который бы принимал класс типа convert.
ну или как вариант статическое поле завести.
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 16
02.12.2013, 10:02  [ТС]     Виртуальные функции #5
то есть мне надо указывать как обычную функцию их? тогда какой смысл от виртуальной функции?
Поля мы еще не проходили
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
02.12.2013, 10:17     Виртуальные функции #6
Мне кажется, Вы не совсем понимаете смысл наследования.
Производный класс содержит ВСЕ методы и данные(поля) базового класса.
Т.е. переменная d там уже есть.
Нюанс в том, что Вы забыли написать конструкторы производных классов,
которые в свою очередь обязаны вызывать конструктор базового класса.
Виртуальная функция нужна для того, чтобы она делала что-то такое,
чего не может сделать функция базового класса (но вызываться она
должна из кода, который не знает о структуре производного класса.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
02.12.2013, 10:18     Виртуальные функции #7
Цитата Сообщение от 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);
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
02.12.2013, 10:25     Виртуальные функции #8
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");
}
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
02.12.2013, 10:35     Виртуальные функции #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
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;
}
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 16
02.12.2013, 10:38  [ТС]     Виртуальные функции #10
Спасибо вам большое! Только я так и не понял какая разница виртуальных от обычных функций потомков? Только имя остается и все?
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
02.12.2013, 10:51     Виртуальные функции #11
Читай про полиморфизм.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 11:03     Виртуальные функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
02.12.2013, 11:03     Виртуальные функции #12
Цитата Сообщение от mirozdan Посмотреть сообщение
какая разница виртуальных от обычных функций потомков?
t=&b; // Инициализируем указатель базового класса адресом базового класса
t->perevod(); // вызывается виртуальный метод из базового класса
t=&a; // Инициализируем указатель базового класса адресом производного класса
t->perevod(); // вызывается виртуальный метод из производного класса хотя и используем тот же самый указатель базового класса
b.perevod(); // вызывается метод из базового класса обычным способом
a.perevod(); // вызывается из производного класса обычным способом
a.convert: : perevod(); // вызывается из базового класса (там двойное двоеточие) обычным способом

Добавлено через 5 минут
Еще можете добавить невиртуальный метод и посмотреть, что в двух первых случаях будет вызываться метод из базового класса.
Yandex
Объявления
02.12.2013, 11:03     Виртуальные функции
Ответ Создать тему
Опции темы

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