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

Наследование классов. Копирование производных классов

02.10.2009, 22:41. Показов 3434. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте всем, у меня такой вопрос:
написал код

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
#include "stdafx.h"
 
class A     //Создаем класс А
{
    int mA;
 
public:
    A (int a = 0) //Конструктор
    {
        mA = a;
    }
 
    const A& operator = (const A& copy) //Перегружаем оператор =
    {
        if(this == &copy)
            return * this;
 
        mA = copy.mA;
 
        return * this;
    }
 
    ~A () {}
 
    void PutA (int a) //Метод задает значение mA
    {
        mA = a;
    }
 
    int GetA () //Возвращает значение mA
    {
        return mA;
    }
};
 
class B :   //Класс В является производным
    public A    //относительно класса А
{
    int mB;
 
public:
    B (int b = 0)
    {
        mB = b;
    }
 
    const B& operator = (const B& copy)
    {
        if(this == &copy)
            return * this;
 
        mB = copy.mB;
 
        return * this;
    }
 
    ~B () {}
 
    void PutB (int b)
    {
        mB = b;
    }
 
    void PrintData()    //Выводит все члены, относящиеся к В
    {
        cout << "mA = " << GetA() << ", mB = " << mB << endl;
    }
};
 
void main()
{
    B b1, b2;   //Создаем 2 объекта
 
    b1.PutA(5); //Задаем в первом значение mA = 5
 
    b2 = b1;    //Копируем из b1 в b2
 
    b1.PrintData(); //Выводим b1
 
    b2.PrintData(); //Выводим b2
}
В итоге получаю на экране:

mA = 5, mB = 0
mA = 0, mB = 0

тоесть когда вызвался перегруженный оператор = для b2 он не скопировал данные из родительского класса. Подскажите пожалуйста как это исправить?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2009, 22:41
Ответы с готовыми решениями:

Множественное наследование. Построение производных классов
Необходимо построить иерархию классов согласно схемы наследования. Каждый класс должен содержать...

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс...

Сравнение производных классов
Друзья! Пусть у меня есть базовый класс S. У него есть два наследника A и B. Как мне скидывать,...

Использование базовых и производных классов
Не могу решить задачу с классами помогите с решением. Создать класс String – строка. Определить...

4
Псевдо программист
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.10.2009, 09:52 2
Хотел предложить сделать так:
C++
1
2
3
4
5
6
7
8
9
10
        const B& operator = (const B& copy)
        {
                if(this == &copy)
                        return * this;
 
                mB = copy.mB;
        PutA(copy.GetA());
 
                return * this;
        }
Но почему-то компилятор ругается:
error C2662: 'A::GetA' : cannot convert 'this' pointer from 'const B' to 'A &'

Хм..
0
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 15
03.10.2009, 10:24  [ТС] 3
Я понял что вы имели ввиду:
C++
1
2
3
4
5
6
7
8
9
10
    const B& operator = (B& copy)
    {
        if(this == &copy)
            return * this;
 
        mB = copy.mB;
        PutA(copy.GetA());
 
        return * this;
    }
так компилятор не ругается и считает все правильно, но это не то что мне нужно. Дело в том что это просто маленький пример, а у меня есть проект побольше, где класс В наследник А, а класс С в свою очередь наследник В, и во всех трёх классах куча членов и методов.
Поэтому такое решение проблемы не подходит, хотелось бы узнать, можноли в операторе = класса В вызвать оператор = класса А
0
Псевдо программист
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
03.10.2009, 10:56 4
Если бы экземпляр класса А был элементом класса Б, то да.
А так, скорей всего, предется перегружать каждый оператор.
0
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
03.10.2009, 14:35 5
В чем проблема? Очень просто.Есть базовый класс
C++
1
2
3
4
5
6
7
class Employee {
  string name, surname;
public:
  // конструктор
  Employee(const Employee&);
  Employee& operator=(const Employee&)
};
Есть наследуемый класс
C++
1
2
3
4
5
6
7
class Programmer: public Employee {
  string team;
public:
   Programmer(const Programmer &);
   Programmer& operator=(const Programmer &)
  //...
};
В операторе мы должны сначала вызвать оператор того класса, от кого наследуется, а остальные челны чем-н. инициализировать:
C++
1
2
3
4
5
6
7
8
9
10
11
// Конструктор:
Programmer::Programmer (const Programmer& rp)
  : Employee(rp), team(rp.team)
{
}
 
Programmer& Programmer::operator=(const Programmer &rp)
{
  Employee::operator=(rp);
  team = rp.team;
}
И так можно иерархию продолжать сколько угодно...
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2009, 14:35
Помогаю со студенческими работами здесь

Файлы и объекты производных классов
Вопрос следующий: имеется два класса, базовый и производный. В файл бинарно записывается объект...

Конструктор по умолчанию для производных классов
Допустим, имеется код: class abstr_emp { private: string fname; // abstr_emp's first...

Массив объектов разных производных классов
Задача такая: базовый класс - фигура, производные классы - круг, треугольник и т.п. Пользователь...

Функция создающая объекты производных классов
Функция получает входной параметр - целое число. Если оно равно 0, создается новый объект -...


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

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

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