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

Наследование и композиция - C++

Восстановить пароль Регистрация
 
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
05.11.2013, 23:44     Наследование и композиция #1
Добрый день. Помогите, пожалуйста, разобраться в приведенном примере.
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
#include <iostream>
#include <fstream>
using namespace std;
 
std::ofstream out("D:\\1.txt");
 
class GameBoard
{
public:
    GameBoard(){out << "GameBoard()\n";}
    GameBoard(const GameBoard&)
    {
    out<<"GameBoard(const GameBoard&)\n";
    }
    GameBoard& operator=(const GameBoard)
    {
     out<<"GameBoard::operator=\n";
     return *this;
    }
    ~GameBoard(){out << "~GameBoard()\n";}
};
 
 
class Game
{
GameBoard gb;
public:
    Game(){out<<"Game()\n";}
    Game(const Game& g): gb(g.gb)
    {
        out<<"Game(const Game& g)\n";
    }
    Game(int){out<<"Game(int)\n";}
    Game& operator=(const Game& g)
    {
        gb = g.gb;
        out<<"Game::operator=()\n";
        return *this;
    }
class Other {};
operator Other() const
{
    out<<"Game::operator Other()\n";
}
~Game()
{
out<<"~Game()\n";
}
 
};
 
class Chess: public Game{};
 
 
void f(Game::Other){}
 
class Checkers:public Game
{
public:
    Checkers(){out<<"Checkers()\n";}
    Checkers(const Checkers& c): Game(c) //но у "Game" нет конструктора, принимающего "Checkers"!
    {
        out<<" Checkers(const Checkers& c)\n";
    }
    Checkers& operator=(const Checkers& c)
    {
        Game::operator=(c);                  //Как мы передаем в "Game::operator="  "const Checkers&", о котором "Game" в жизни не слышал?
        out<<"Checkers& operator=";
        return *this;
    }
 
};
 
int main()
{
    Chess d1; //здесь понятно, генерируется конструктор для chess и вызываются GameBoard() и Game()
                  //GameBoard()
                  //Game()
    out<<"1\n";
    Chess d2(d1); //генерируется копирующий конструктор и вызываются GameBoard(const GameBoard&) Game(const Game& g)
                        //GameBoard(const GameBoard&)
                        //Game(const Game& g)
    out<<"2\n";
    //Chess d3(1);//отсутствует конструктор для int
    d1=d2;          
                       //GameBoard(const GameBoard&)  Не очень понятно как тут оказался копирующий конструктор?
                       //GameBoard::operator=
                      //~GameBoard()
                      //Game::operator=()                     И почему его не оказалось здесь?
    out<<"3\n";
    f(d1);        //Game::operator Other()  преобразование Game в Other
    out<<"4\n";
    Game::Other go;
    out<<"5\n";
    //d1=go;    Нет подходящего оператора
    Checkers c1,c2(c1);  //GameBoard()
                                 //Game()
                                 //Checkers()
                                 //GameBoard(const GameBoard&)
                                 //Game(const Game& g)
                                 // Checkers(const Checkers& c)
    out<<"6\n";
    c1=c2;                    //GameBoard(const GameBoard&)   //Откуда опять копирующий конструктор?
                                 //GameBoard::operator=
                                 //~GameBoard()
                                 //Game::operator=()
                                 //Checkers& operator=
}
Видимо, я что-то сильно недопонял в наследовании, наставьте на путь истинный, а то уже второй день голову ломаю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
06.11.2013, 10:09     Наследование и композиция #2
А, у меня компилятор говорит, что у этого метода должен быть return
C++
1
operator Other() const
т.е. надо вернуть объект типа Other, а где класс, то Other() описан не вижу, а вот увидел
C++
1
class Other {};
ну ладно, а какой объект возвращать не вижу
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
06.11.2013, 11:15  [ТС]     Наследование и композиция #3
Компилирую в GCC.
Видимо многим лень читать простыню, поэтому сокращу до 1 вопроса:
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
class Game
{
public:
    Game& operator=(const Game& g)
    {
        cout<<"Game::operator=()\n";
        return *this;
    }
 
};
 
class Checkers: public Game
{
public:
 
    Checkers& operator=(const Checkers& c)
    {
        Game::operator=(c);
        cout<<"Checkers& operator=";
        return *this;
    }
 
};
 
int main()
{
    Checkers c1,c2;
    c1=c2;
}
Как в 19 строке мы передаём в "Game::operator=()" "const Checkers&", в то время как оператор принимает только "const Game&", а автоматического приведения типов у нас нет.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
06.11.2013, 11:25     Наследование и композиция #4
Checkers - это наследник Game. А значит компилятор может const Checkers& скастовать к const Game&
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 249
06.11.2013, 11:40     Наследование и композиция #5
Я так понимаю что у объекта наследника есть две части базовая и своя, отличающая его от родителя. Наверно надо два присвоения сделать для одной части и для другой, используя каждый раз соответствующий оператор присвоения, ну и передавая каждой из них чета свое.
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
06.11.2013, 14:49  [ТС]     Наследование и композиция #6
Вроде осознал, ожидал чего-то намного более запутанного, спасибо.
С "лишними" копирующими конструкторами сам разобрался.
Yandex
Объявления
06.11.2013, 14:49     Наследование и композиция
Ответ Создать тему
Опции темы

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