Skip to content

Commit a2c6d18

Browse files
author
Oguzhan Katli
committed
inheritance section revisited
1 parent 967c064 commit a2c6d18

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
lines changed

inc/advanced_cpp_topics.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
#include "playground_organizer.hpp"
33

44
// Inheritance
5-
CREATE_ELEMENT(FriendUsageExample);
65
CREATE_ELEMENT(InheritanceUsageExample);
6+
CREATE_ELEMENT(InheritanceAccessControl);
77
CREATE_ELEMENT(DiamondProblemExample);
88
CREATE_ELEMENT(VirtualDestructorUsage);
9+
CREATE_ELEMENT(FriendUsageExample);
910

1011
// Smart Pointers
1112
CREATE_ELEMENT(MallocUsageExample);

main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ int main(int argc, char *argv[]) {
1212
po.builder()
1313
// Inheritance
1414
.Add<InheritanceUsageExample>()
15+
.Add<InheritanceAccessControl>()
1516
.Add<DiamondProblemExample>()
1617
.Add<VirtualDestructorUsage>()
1718
.Add<FriendUsageExample>()

src/1-Inheritance/inheritance_usage.cpp

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,86 @@ void getCircleFromShape(Shape* shape)
9797

9898
ELEMENT_CODE(InheritanceUsageExample)
9999
{
100-
std::vector<Shape*> shapes {
101-
new Circle(5),
102-
new Rectangle(3, 5),
103-
new Triangle(12, 3, 30)
104-
};
100+
std::vector<std::unique_ptr<Shape>> shapes;
101+
shapes.emplace_back(new Circle(5));
102+
shapes.emplace_back(new Rectangle(3, 5));
103+
shapes.emplace_back(new Triangle(12, 3, 30));
105104

106105
auto total_area = std::reduce(begin(shapes),
107106
end(shapes),
108107
0.f,
109-
[](float area, Shape* shape) {
108+
[](float area, auto& shape) {
110109
return area + shape->getArea();
111110
});
112111
std::cout << "total area of all shapes are " << std::fixed << total_area << "\n";
112+
}
113+
114+
115+
// inheritance access control
116+
117+
class base
118+
{
119+
public:
120+
base() {
121+
static auto print_once = [&] {
122+
std::cout << "class can access all of its members "
123+
"no matter access control\n";
124+
std::cout << "private var: " << private_var << "\n";
125+
std::cout << "protected var: " << protected_var << "\n";
126+
std::cout << "public var: " << public_var << "\n";
127+
return true;
128+
} ();
129+
}
130+
public:
131+
int public_var{ 1 };
132+
protected:
133+
int protected_var{ 2 };
134+
private:
135+
int private_var{ 3 };
136+
};
137+
138+
class public_derived
139+
: public base { };
140+
141+
class protected_derived
142+
: protected base { };
143+
144+
class private_derived
145+
: private base {
146+
public:
147+
private_derived() {
148+
std::cout << "derived classes can access protected and "
149+
"public base variables inside of class\n";
150+
// std::cout << "private var: " << private_var << "\n";
151+
std::cout << "base protected var: " << protected_var << "\n";
152+
std::cout << "base public var: " << public_var << "\n";
153+
}
154+
};
155+
156+
ELEMENT_CODE(InheritanceAccessControl)
157+
{
158+
base b;
159+
public_derived pd;
160+
protected_derived pro_d;
161+
private_derived priv_d;
162+
std::cout << "access to base class variables from "
163+
"derived class instances depends on inheritance type\n";
164+
165+
std::cout << "when an inheritance marked as protected; all public "
166+
"members of base goes to protected inside of derived class\n";
167+
168+
std::cout << "when an inheritance made as private then members of base "
169+
"goes to private inside of derived class\n";
170+
//pd.public_var;
171+
//pd.protected_var;
172+
//pd.private_var;
173+
//
174+
//pro_d.public_var;
175+
//pro_d.protected_var;
176+
//pro_d.private_var;
177+
//
178+
//priv_d.public_var;
179+
//priv_d.protected_var;
180+
//priv_d.private_var;
113181

114182
}

0 commit comments

Comments
 (0)