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

Класс работник. Виртуальный метод - C++

Восстановить пароль Регистрация
 
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
16.07.2013, 23:45     Класс работник. Виртуальный метод #1
Здраствуйте! Надо ввести работников с почасовой ЗП и фиксированной ЗП.
Написать виртуальный метод для подсчета ЗП( для почасовиков - 20*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
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual void calc(){}       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
    void calc()
    {
    // формула 20*8*М
    }
};
class C : public A
{
    public:
    C(){};
    ~C(){};
    void calc()
    {
        // фиксированная зп
    }
};
void main()
{
    B obj[10]; // для работников с почасовой ЗП
    C obj1[10]; // фиксированная ЗП
    
    cout << "Enter data about workers with salary per hour " << endl;
    for(int i = 0; i < 3; i++)
        obj[i].in();
    cout << "Enter data about workers with fixed salary " << endl;
    for(int i = 0; i < 2; i++)
        obj1[i].in();
 
    /*for(int i = 0; i < 3; i++)
        obj[i].out();*/
 
    cin.get();
    cin.get();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 23:45     Класс работник. Виртуальный метод
Посмотрите здесь:

C++ Виртуальный базовый класс
Указатель на виртуальный класс C++
Виртуальный метод с параметром типа класс C++
C++ Класс работник. Сортировка. Советы по коду
Виртуальный метод C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
17.07.2013, 00:31     Класс работник. Виртуальный метод #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
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual double calc(){
    return 0;}       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
    double c=20*8*M;
    return c;
    }
};
class C : public A
{
    public:
    C(){};
    ~C(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
      double  c=M; // фиксированная зп
       return c;
    }
};
void main()
{
    B obj[10]; // для работников с почасовой ЗП
    C obj1[10]; // фиксированная ЗП
    double c;
    cout << "Enter data about workers with salary per hour " << endl;
    for(int i = 0; i < 3; i++)
    {
        obj[i].in();
        c=obj[i].calc();
        cout<<"income "<<c<<endl;
    }
 
    cout << "Enter data about workers with fixed salary " << endl;
    for(int i = 0; i < 2; i++)
    {
        obj1[i].in();
        c=obj1[i].calc();
        cout<<"income "<<c<<endl;
    }
    /*for(int i = 0; i < 3; i++)
        obj[i].out();*/
 
    cin.get();
    cin.get();
}
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
17.07.2013, 00:43  [ТС]     Класс работник. Виртуальный метод #3
Цитата Сообщение от Valentina Посмотреть сообщение
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual double calc(){
    return 0;}       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
    double c=20*8*M;
    return c;
    }
};
class C : public A
{
    public:
    C(){};
    ~C(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
      double  c=M; // фиксированная зп
       return c;
    }
};
void main()
{
    B obj[10]; // для работников с почасовой ЗП
    C obj1[10]; // фиксированная ЗП
    double c;
    cout << "Enter data about workers with salary per hour " << endl;
    for(int i = 0; i < 3; i++)
    {
        obj[i].in();
        c=obj[i].calc();
        cout<<"income "<<c<<endl;
    }
 
    cout << "Enter data about workers with fixed salary " << endl;
    for(int i = 0; i < 2; i++)
    {
        obj1[i].in();
        c=obj1[i].calc();
        cout<<"income "<<c<<endl;
    }
    /*for(int i = 0; i < 3; i++)
        obj[i].out();*/
 
    cin.get();
    cin.get();
}
спасибо, но не совсем так, тут метод calc() может быть НЕ виртуальным и он будет работать
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
17.07.2013, 00:54     Класс работник. Виртуальный метод #4
ovner, функция однажды объявленная виртуальной, будет такой у всех наследников, так что я к примеру всегда явно прописываю, чтобы было видно, а так можно толькопервый раз virtual написать...
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
17.07.2013, 00:57     Класс работник. Виртуальный метод #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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual double calc(){
    return 0;}       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
    double c=20*8*M;
    return c;
    }
};
class C : public A
{
    public:
    C(){};
    ~C(){};
    void in()
    {
        A::in();
    }
    double calc()
    {
      double  c=M; // фиксированная зп
       return c;
    }
};
void main()
{
    A *a[2];
    B b; // для работников с почасовой ЗП
    C c; // фиксированная ЗП
    double k;
    cout << "Enter data about workers with salary per hour " << endl;
    a[0]=&b;
        a[0]->in();
        k=a[0]->calc();
        cout<<"income "<<k<<endl;
    
 
    cout << "Enter data about workers with fixed salary " << endl;
    a[1]=&c;
        a[1]->in();
        k=a[1]->calc();
        cout<<"income "<<k<<endl;
    
    /*for(int i = 0; i < 3; i++)
        obj[i].out();*/
 
    cin.get();
    cin.get();
}
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
17.07.2013, 01:01  [ТС]     Класс работник. Виртуальный метод #6
Цитата Сообщение от arhistratig13 Посмотреть сообщение
ovner, функция однажды объявленная виртуальной, будет такой у всех наследников, так что я к примеру всегда явно прописываю, чтобы было видно, а так можно толькопервый раз virtual написать...
я курсе, я говорю про то что если в этом коде, в базовом классе написать просто double calc() без слова виртуал, то метод всеравно будет работать, тут простой полиморфизм, а мне надо что бы метод был чисто виртуальной
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
17.07.2013, 01:06     Класс работник. Виртуальный метод #7
ovner, если чисто виртуальный то virtual double calc()=0, но тогда учти, что класс станет абстрактным.
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
17.07.2013, 01:10  [ТС]     Класс работник. Виртуальный метод #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
void main()
{
    A *a[5];
    A *b[5];
    cout << "Enter data about workers with salary per hour " << endl;
   for(int i = 0; i < 3; i++)
   {
   a[i] = new B;
   a[i]->in();
   a[i]->calc();
   } 
 
    cout << "Enter data about workers with fixed salary " << endl;
   for(int i = 0; i < 3; i++)
   {
   b[i] = new C;
   b[i]->in();
   b[i]->calc();
   }
    
    for(int i = 0; i < 3; i++)
        a[i]->out();
    for(int i = 0; i < 3; i++)
        b[i]->out();
 
    cin.get();
    cin.get();
}
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
17.07.2013, 01:15     Класс работник. Виртуальный метод #9
ovner, ну все тогда делай абстрактным класс A и все, понял, видимо в задании нужно выделить абстрактную сущность Рабтника, а инициализировать его уже классами в зависимости от зарплаты...
Правильно понял?
ovner
7 / 7 / 0
Регистрация: 06.10.2012
Сообщений: 140
17.07.2013, 01:21  [ТС]     Класс работник. Виртуальный метод #10
Цитата Сообщение от arhistratig13 Посмотреть сообщение
ovner, ну все тогда делай абстрактным класс A и все, понял, видимо в задании нужно выделить абстрактную сущность Рабтника, а инициализировать его уже классами в зависимости от зарплаты...
Правильно понял?
что-то типо этого

Добавлено через 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <string>
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual void calc() = 0{}       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
 
    void calc()
    {
        this->M = M * 20 * 8;
    }
};
class C : public A
{
    public:
    C(){};
    ~C(){};
   
    void calc()
    {
      this->M = M * 1;
    }
};
void main()
{
   A *a[5];
   A *b[5];
   cout << "Enter data about workers with salary per hour " << endl;
   for(int i = 0; i < 2; i++)
   {
   a[i] = new B;
   a[i]->in();
   a[i]->calc();
   } 
 
   cout << "Enter data about workers with fixed salary " << endl;
   for(int i = 0; i < 2; i++)
   {
   b[i] = new C;
   b[i]->in();
   b[i]->calc();
   }
    
    for(int i = 0; i < 2; i++)
        a[i]->out();
    for(int i = 0; i < 2; i++)
        b[i]->out();
    cin.get();
    cin.get();
}
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
17.07.2013, 01:52     Класс работник. Виртуальный метод #11
ovner, Да вроде все прилично... задачу свою делает... вот немного бы подправил:
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
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    [B]virtual[/B] ~A(){};
    virtual void calc() = 0[B];[/B]       // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
    cout << "Enter name" << endl;
    getline(cin, S);
    cout << "Enter salary" << endl;
    cin >> this->M; 
    cin.ignore();
    }
};
 
class B : public A
{
public:
    B()[B]:A()[/B]{};
    ~B(){};
 
    void calc()
    {
        this->M = M * 20 * 8;
    }
};
class C : public A
{
    public:
    C()[B]:A()[/B]{};
    ~C(){};
   
    void calc()
    {
      this->M = M * 1;
    }
};
Как то вот так, чтобы наследование более натурально было!
Теги убери, думал жирным выделит в коде... а нет)
C++
1
[B][/B]
valik35
1 / 1 / 0
Регистрация: 17.07.2013
Сообщений: 29
17.07.2013, 02:00     Класс работник. Виртуальный метод #12
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>//зачем???
using namespace std;
 
class A
{
protected:
    string S;
    double M;
public:
    A(){};
    ~A(){};
    virtual void calc()=0;     // виртуальный метод
    void out()
    {
        cout << S <<  " " << M << endl;
    }
    void in()
    {       
        cout << "Enter name" << endl;
        getline(cin, S);
        cout << "Enter salary" << endl;
        cin >> this->M; 
        cin.ignore();
    }
};
 
class B : public A
{
public:
    B(){};
    ~B(){};
    virtual void calc()
    {
        cout<<S<<"'s salary is "<<M*20*8<<" $\n";
    }
};
class C : public A
{
public:
    C(){};
    ~C(){};
    virtual void calc()
    {
        cout<<S<<"'s salary is "<<0/*не понял что значит фиксированая зарплата*/<<" $\n";
    }
}
int main()
{
    const int size_a=2, size_b=3, size_c=3;
    A *obj[size_a] = {new B[size_b], new C[size_c]};// для работников с почасовой ЗП// фиксированная ЗП
 
    cout << "Enter data about workers with salary per hour " << endl;
    for(int i = 0; i < size_b; i++)
        obj[0][i].in();
    cout << "Enter data about workers with fixed salary " << endl;
    for(int i = 0; i < size_c; i++)
        obj[1][i].in();
 
    for(int i = 0; i < size_b; i++)
        obj[0][i].out();
    for(int i = 0; i < size_c; i++)
        obj[1][i].out();
 
    cin.get();
    cin.get();
    return 0;
}
вызывать метод также как и in или out
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 06:17     Класс работник. Виртуальный метод
Еще ссылки по теме:

Класс работник, сортировка C++
C++ Виртуальный метод
C++ Абстрактный класс. Виртуальный метод, который возвращает T- тип

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

Или воспользуйтесь поиском по форуму:
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
17.07.2013, 06:17     Класс работник. Виртуальный метод #13
Цитата Сообщение от valik35 Посмотреть сообщение
вызывать метод также как и in или out
Не понял
Yandex
Объявления
17.07.2013, 06:17     Класс работник. Виртуальный метод
Ответ Создать тему
Опции темы

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