С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
#1

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

05.11.2013, 23:44. Просмотров 480. Ответов 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
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=
}
Видимо, я что-то сильно недопонял в наследовании, наставьте на путь истинный, а то уже второй день голову ломаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2013, 23:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование и композиция (C++):

Наследование, композиция и агрегация - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; class A { public: A() { cout&lt;&lt;&quot;Of A +&quot;&lt;&lt;...

Наследование и композиция: фигура, круг - C++
Получил вот такое задание Наследование и композиция. Фигура, координата, цвет, линия, фон, заголовок, круг. Общее: 1....

Очень срочно , через 2 дня сдача) (композиция, наследование) - C++
ребята, сделайте пожалуйста код как можно стандартнее)) спасибо)

Наследование vs Композиция vs Агрегация: что лучше выбрать? Как лучше передавать объекты в функции? - C++
Добрый день!! Дело вот в чём, я хочу создать класс, внутри которого будут созданы объекты других классов (реализованных в некоторой...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Композиция - C++
Добр время суток. Объясните пожалуйста принцип действия композиции и как с ней работать и что это такое. Искал инфу в нете но что то не...

5
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
06.11.2013, 10:09 #2
А, у меня компилятор говорит, что у этого метода должен быть return
C++
1
operator Other() const
т.е. надо вернуть объект типа Other, а где класс, то Other() описан не вижу, а вот увидел
C++
1
class Other {};
ну ладно, а какой объект возвращать не вижу
0
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&", а автоматического приведения типов у нас нет.
0
I.M.
566 / 549 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
06.11.2013, 11:25 #4
Checkers - это наследник Game. А значит компилятор может const Checkers& скастовать к const Game&
1
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
06.11.2013, 11:40 #5
Я так понимаю что у объекта наследника есть две части базовая и своя, отличающая его от родителя. Наверно надо два присвоения сделать для одной части и для другой, используя каждый раз соответствующий оператор присвоения, ну и передавая каждой из них чета свое.
0
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
06.11.2013, 14:49  [ТС] #6
Вроде осознал, ожидал чего-то намного более запутанного, спасибо.
С "лишними" копирующими конструкторами сам разобрался.
0
06.11.2013, 14:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 14:49
Привет! Вот еще темы с ответами:

Композиция с++ - C++
Подскажите полузнайства! На примере как реализовать конструктор копии если у меня есть 2 класса с помощью композиции. class A{ ...

Композиция/Агрегация - C++
Не понимаю четкой разницы между этими понятиями. Нашел тему на форуме http://www.cyberforum.ru/cpp-beginners/thread1312947.html, но из...

Что такое композиция ? - C++
Читаю учебник Р.Лафоре &quot;Объектно-ориентированное программирование в C++&quot;. На странице 403 пишется про композицию. Пример не приводится....

Что такое композиция? - C++
Добрый день. Тут читаю книгу и в ней приводится длинющий и непонятный пример композиции. Попросил бы Вас привести простенький пример...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.