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

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

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

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

02.12.2013, 09:41. Просмотров 331. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 09:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальные функции (C++):

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

виртуальные функции - C++
Помогите пожалуйста, создать абстрактный класс Shape с двумя чисто виртуальными методами Area() и Print(). Определить производные классы ...

Виртуальные функции - C++
Доброго времени суток. Есть задание. Создать абстрактный класс Function (функция) с виртуальными методами вычисления значения функции...

Виртуальные функции в С++ - C++
Здравствуйт. Помогите осмыслить доконца вирт. ф-ции. После прочтения источников я собрал определенную картину: Вирт функции...

Виртуальные функции - C++
Здравствуйте,уважаемые посетители форума.Пишу программу созданию фигур и их перемещению на экране использую виртуальные функции.И...

Виртуальные функции - C++
Разработать программу с использованием наследования классов, реализующую классы: Земноводное(ареал обитания)-&gt;Крокодил(род, длина, вес) ...

11
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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)
 {}
...
Не понятен вопрос:
как передать переменную из одной виртуальной функции в другую
Что вообще под этим подразумевается? В коде ничего похожего не увидел.
0
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 09:56  [ТС] #3
мне надо передать переменную мою q в другие классы то есть чтобы в conver2 и convert3 тоже использовалась число переменной q
0
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 10:00 #4
Объекты a и s не проинициализированы, поэтому и мусор получаешь .
Может конструктор создать, который бы принимал класс типа convert.
ну или как вариант статическое поле завести.
0
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 10:02  [ТС] #5
то есть мне надо указывать как обычную функцию их? тогда какой смысл от виртуальной функции?
Поля мы еще не проходили
0
zss
Модератор
Эксперт С++
6483 / 6046 / 1983
Регистрация: 18.12.2011
Сообщений: 15,676
Завершенные тесты: 1
02.12.2013, 10:17 #6
Мне кажется, Вы не совсем понимаете смысл наследования.
Производный класс содержит ВСЕ методы и данные(поля) базового класса.
Т.е. переменная d там уже есть.
Нюанс в том, что Вы забыли написать конструкторы производных классов,
которые в свою очередь обязаны вызывать конструктор базового класса.
Виртуальная функция нужна для того, чтобы она делала что-то такое,
чего не может сделать функция базового класса (но вызываться она
должна из кода, который не знает о структуре производного класса.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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);
0
zss
Модератор
Эксперт С++
6483 / 6046 / 1983
Регистрация: 18.12.2011
Сообщений: 15,676
Завершенные тесты: 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");
}
1
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
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;
}
1
mirozdan
1 / 1 / 0
Регистрация: 15.07.2013
Сообщений: 19
02.12.2013, 10:38  [ТС] #10
Спасибо вам большое! Только я так и не понял какая разница виртуальных от обычных функций потомков? Только имя остается и все?
0
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
02.12.2013, 10:51 #11
Читай про полиморфизм.
0
zss
Модератор
Эксперт С++
6483 / 6046 / 1983
Регистрация: 18.12.2011
Сообщений: 15,676
Завершенные тесты: 1
02.12.2013, 11:03 #12
Цитата Сообщение от mirozdan Посмотреть сообщение
какая разница виртуальных от обычных функций потомков?
t=&b; // Инициализируем указатель базового класса адресом базового класса
t->perevod(); // вызывается виртуальный метод из базового класса
t=&a; // Инициализируем указатель базового класса адресом производного класса
t->perevod(); // вызывается виртуальный метод из производного класса хотя и используем тот же самый указатель базового класса
b.perevod(); // вызывается метод из базового класса обычным способом
a.perevod(); // вызывается из производного класса обычным способом
a.convert: : perevod(); // вызывается из базового класса (там двойное двоеточие) обычным способом

Добавлено через 5 минут
Еще можете добавить невиртуальный метод и посмотреть, что в двух первых случаях будет вызываться метод из базового класса.
0
02.12.2013, 11:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 11:03
Привет! Вот еще темы с ответами:

Виртуальные функции - C++
Создайте класс Word, определите в нем виртуальную функцию-член word_main(*char x), которая выводит на экран фразу: “Я знаю слово x”....

виртуальные функции - C++
ввести виртуальную функцию class A { void init(); } classB:A { void init(); }

Виртуальные функции - C++
Здравствуйте, помогите пожалуйста с вопросом: Заданный порожденный класс, содержащий две функции по таким именно именами, как и в...

Виртуальные функции - C++
Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со...


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

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

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