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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
V.I.P.
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 15
#1

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

02.10.2009, 22:41. Просмотров 1594. Ответов 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 он не скопировал данные из родительского класса. Подскажите пожалуйста как это исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2009, 22:41     Наследование классов. Копирование производных классов
Посмотрите здесь:

Создать массив в базовом абстрактном классе, и его передать функциям производных классов C++
C++ Ошибка при создании двумерного массива из объектов производных классов
C++ Наследование Классов
C++ Массив объектов разных производных классов
C++ Использование базовых и производных классов
Структура наследования базовых/производных классов: error LNK 1104 C++
C++ Конструктор по умолчанию для производных классов
C++ Сравнение производных классов
C++ Множественное наследование. Построение производных классов
Файлы и объекты производных классов C++
Функция создающая объекты производных классов C++
C++ Конструктор копирования производных классов: для чего это нужно?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 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 &'

Хм..
V.I.P.
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;
    }
так компилятор не ругается и считает все правильно, но это не то что мне нужно. Дело в том что это просто маленький пример, а у меня есть проект побольше, где класс В наследник А, а класс С в свою очередь наследник В, и во всех трёх классах куча членов и методов.
Поэтому такое решение проблемы не подходит, хотелось бы узнать, можноли в операторе = класса В вызвать оператор = класса А
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
03.10.2009, 10:56     Наследование классов. Копирование производных классов #4
Если бы экземпляр класса А был элементом класса Б, то да.
А так, скорей всего, предется перегружать каждый оператор.
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
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;
}
И так можно иерархию продолжать сколько угодно...
Yandex
Объявления
03.10.2009, 14:35     Наследование классов. Копирование производных классов
Ответ Создать тему
Опции темы

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