0 / 0 / 0
Регистрация: 19.03.2017
Сообщений: 13
1

виртуальные методы

28.05.2017, 04:37. Показов 608. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include<iostream>
 
#include<stdlib.h>
using namespace std;
class MArray 
{
    protected:
    static const int MAX=512;
    unsigned char *arr;
    int len;
    public:
        MArray();
        MArray(int n);
        virtual~MArray(void);
        int lenght(){return len;}
        unsigned char&operator[](const int index);
        friend ostream&operator<<(ostream & out, MArray& a);
        virtual MArray operator+(MArray& in_arr);
};
MArray::MArray():len(0), arr(NULL){}
MArray::MArray(int n): len(n)
{
    arr = new unsigned char[n];
    for(int index=0; index<n; index++)
    {
        arr[index]=0;
    }
}
MArray::~MArray(void){delete [] arr;}
unsigned char& MArray::operator[](const int index)
{   if(index>0||index<MAX)
    return arr[index];
}
ostream& operator<<(ostream& out, MArray& a)
{
    for(int index=0; index<a.len; index++)
    {
    out<<(int)a.arr[index]<<",";
    }
    out<<endl;
    return out;
}
MArray MArray::operator+(MArray& in_arr)
{
    int max_len=max(lenght(), in_arr.lenght());
    MArray ret(max_len);
    int min_len=min(lenght(),in_arr.lenght());
    for(int index=0; index<max_len; index++)
    {
        ret[index]=(index<min_len)?arr[index]+in_arr.arr[index]:((min_len==lenght())?in_arr.arr[index]:arr[index]);
    }
    return ret;
}
class MSet:public MArray
{
    public:
        MSet(void);
        MSet (int n);
        virtual ~MSet(void);        virtual MArray operator+(MArray& in_arr);
};
MSet::MSet():MArray(){}
MSet::MSet(int n):MArray(n){}
MSet::~MSet(void){}
MArray MSet::operator+(MArray& in_arr)
{
    int max_len=max(lenght(), in_arr.lenght());
    MArray ret(max_len);
    int min_len=min(lenght(),in_arr.lenght());
    for(int index=0; index<max_len; index++)
    {
        ret[index]=(index<min_len)?arr[index]+in_arr.arr[index]:((min_len==lenght())?in_arr.arr[index]:arr[index]);
    }
    return ret;
}
class MFraction:public MArray
    {
        public:
            MFraction(void);
            MFraction(int n);
            virtual~MFraction(void);
            virtual MArray operator+(MArray& in_arr);
    };
    MFraction::MFraction(void):MArray(){}
MFraction::MFraction(int n):MArray(){}
MFraction::~MFraction(void){}
MArray MFraction::operator+(MArray& in_arr)
{   int max_len=max(lenght(), in_arr.lenght());
    MArray ret(max_len);
    int min_len=min(lenght(),in_arr.lenght());
    for(int index=0; index<max_len; index++)
    {
        ret[index]=(index<min_len)?arr[index]+in_arr.arr[index]:((min_len==lenght())?in_arr.arr[index]:arr[index]);
    }
    return ret;
}
int main()
{
    MArray x(7);
    for(int index=0; index<x.lenght();index++)
    {
        x[index]=rand()%250;
     } 
     cout<<x;
     MArray y(10);
    for(int index=0; index<y.lenght();index++)
    {
        y[index]=rand()%250;
     } 
      cout<<y;
    MFraction z(100);
     for(int index=0; index<z.lenght(); index++)
     {
        z[index]=rand()%9;
     }
     cout<<z;    MArray v=x+y;
     cout<<v;
     return 0;
}
Помогите разобраться с ошибками:
[Error] 'unsigned char* MArray::arr' is protected
[Error] within this context
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2017, 04:37
Ответы с готовыми решениями:

Виртуальные методы
Дан родительский класс Animal (поле кличка). И два наследованных от него класса-потомка: Cat (поле...

Виртуальные методы
Здраствуйте , вот писал виртуальный метод доступа но почему то не получаеться , подскажите почему...

Виртуальные методы
Всем доброго времени суток! Вопрос следующий. Как я могу функцией делать подмену виртуального...

Виртуальные методы
...в голове не укладываются. Помогите кто может :confusion: У меня про них сложилось...

3
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,687
28.05.2017, 06:16 2
C++
1
2
MArray MSet::operator+(MSet& in_arr);
MArray MFraction::operator+(MFraction& in_arr);
А зачем вообще этот метод объявлен виртуальным?
Вы не используете полиморфизм.

И еще
C++
1
2
3
4
5
6
MFraction::MFraction(int n):MArray(n){}
unsigned char& MArray::operator[](const int index)
{   if(index>0||index<MAX)
        return arr[index];
    return arr[0];
}
0
0 / 0 / 0
Регистрация: 19.03.2017
Сообщений: 13
28.05.2017, 07:58  [ТС] 3
zss, В задании дано, что нужно в классе Array реализовать виртуальную функцию поэлементного сложения массивов и переопределить эту функцию в двух других классах. Я решил проверить пример данный в методичке, и в итоге есть эти ошибки. А не поняв эти ошибки, я не могу сделать на основе этого свою работу.
0
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,687
28.05.2017, 09:11 4
Ну тогда и вызывайте ее правильно - через указатель на базовый класс.

А по существу вопроса - переменная, переданная в параметре, не относится к экземпляру, вызвавшему метод.
Поэтому и доступ к ней идет не как к родственной переменной.
Я пока не вижу выхода кроме, как, объявить производный класс дружественный к базовому
(хотя это и противоречит концепции ООП).

Ну, или обращайтесь к arr через operator[]:
C++
1
        ret[index]=(index<min_len)?arr[index]+in_arr[index]:((min_len==lenght())?in_arr[index]:arr[index]);
0
28.05.2017, 09:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2017, 09:11
Помогаю со студенческими работами здесь

Виртуальные методы
народ вот пример с виртуальными методами, и вывод этой программы class Ancestor { public: ...

виртуальные методы
как вызвать виртуальный метод базового класса из наследуемого класса? struct A { virtual void...

Наследование и виртуальные методы
Начал разбираться с темой наследование и не совсем понимаю как наследуются виртуальные методы,...

Виртуальные методы класса
Скажите, зачем нужны виртуальные методы? Почему нельзя использовать стандартные? Спасибо.

Виртуальные методы(теория)
Здравствуйте уважаемые форумчане! В ходе обучения языку с++ возник вопрос непонимания назначения...

Виртуальные и переопределённые методы
Здравствуйте! Пусть есть очень простой базовый класс: class Base { public: virtual...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru