-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInheritance9.h
156 lines (137 loc) · 2.83 KB
/
Inheritance9.h
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma once
#define PI 3.14159265358979323846
class RhombusInheritanceDemo
{
// òî÷êà
class Point
{
protected:
double x_;
double y_;
public:
Point()
{
cout << "Point default c-tor!\n";
x_ = y_ = 5;
}
Point(int x, int y)
{
cout << "Point param c-tor!\n";
x_ = x;
y_ = y;
}
void Print() const
{
cout << "Point - X: " << x_ << ", Y: " << y_ << "\n";
}
~Point()
{
//cout << "Point destructor!\n";
}
};
// îêðóæíîñòü
class Circle : virtual public Point
{
protected:
double radius_;
double area_;
public:
Circle()
{
cout << "Circle default c-tor!\n";
radius_ = 5;
area_ = PI * radius_ * radius_;
}
Circle(int center_x, int center_y, int radius) : Point(center_x, center_y)
{
cout << "Circle param c-tor!\n";
radius_ = radius;
area_ = PI * radius_ * radius_;
}
void Print() const
{
//Point::Print();
cout << x_ << " " << y_ << " " << radius_ << "\n";
}
~Circle()
{
//cout << "Circle destructor!\n";
}
};
// êâàäðàò
class Square : virtual public Point
{
protected:
double side_;
double area_; // TO DO: remove redundant field
public:
Square()
{
cout << "Square c-tor!\n";
side_ = 10;
area_ = abs(side_) * abs(side_);
}
void Print() const
{
//Point::Print();
cout << x_ << " " << y_ << " " << side_ << "\n";
}
~Square()
{
//cout << "Square destructor!\n";
}
};
// îêðóæíîñòü, âïèñàííàÿ â êâàäðàò
class SquareCircle : public Circle, public Square
{
double exclusive_area_;
public:
SquareCircle()
{
x_ = 0;
y_ = 0;
cout << "SquareCircle c-tor!\n";
exclusive_area_ = Square::area_ - Circle::area_; // OOPS!
}
void Print() const
{
//Square::Print();
//Circle::Print();
cout << x_ << " " << y_ << " " << side_ << "\n";
cout << "SquareCircle::Print - OOPS!\n";
}
~SquareCircle()
{
cout << "SquareCircle destructor!\n";
}
};
/*
 ñîâðåìåííîé ìåòîäîëîãèè îáúåêòíî-îðèåíòèðîâàííîãî
ïðîãðàììèðîâàíèÿ ñóùåñòâóåò òðè ñïîñîáà ðåøåíèÿ ýòîé ïðîáëåìû.
Ïåðâûé – îáúåäèíÿòü òàêèå ïîëÿ â îäíî ïîëå â ïðîèçâîäíîì êëàññå
(íóæåí âèðòóàëüíûé áàçîâûé êëàññ).
// https://ravesli.com/urok-169-virtualnyj-bazovyj-klass/
Âòîðîé – ðàññìàòðèâàòü òàêîé êîíôëèêò êàê îøèáêó
(òî åñòü, âîîáùå ñòàðàòüñÿ íå ïðèìåíÿòü ìí. íàñëåäîâàíèå!).
È, íàêîíåö, òðåòèé, ÷àñòî èñïîëüçóåìûé â C++, – èñïîëüçîâàòü
îïåðàöèþ ðàçðåøåíèÿ êîíòåêñòà äëÿ äîñòóïà ê òàêèì ïîëÿì
â ïðîèçâîäíîì êëàññå.
*/
public:
static void Test()
{
Point point;
point.Print();
cout << "\n==============================\n\n";
Circle circle;
circle.Print();
cout << "\n==============================\n\n";
Square square;
square.Print();
cout << "\n==============================\n\n";
SquareCircle sc;
sc.Print();
cout << "\n==============================\n\n";
}
};
// RhombusInheritanceDemo::Test();