-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathInheritance_Part_IV(Access Specifier).cpp
132 lines (112 loc) · 3.01 KB
/
Inheritance_Part_IV(Access Specifier).cpp
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
#include <iostream>
using namespace std;
/*
Inheritance - IIV
-Protected accesss specifier
Access Specification
-Derived class cannot access private members of Base class
-Derived class can access public members of Base class
-Protected Access Specification
-A new protected access specification is introduced for Base class.
-Derived class can access protected members of Base class.
-No other class or global function can access protected members of Base class
-A protected member in Base class is like public for Derived class
-A protected member in Base class is like private in other classes or global functions.
Three important examples below:
*/
///************EXAMPLE-1***************///
class B { //Base class
private:
//Inaccessible to child
//Inaccessible to others
int data_ = 1;
public:
// ...
void print() {
cout << "B Object: " << data_ << endl;
}
};
class D : public B { //Derived Class
private:
int info_ = 2;
public:
// ...
void print() {
cout << "D Object: " << data_ << endl; //Inaccessible (Error!!!!)
//In order to fix this, make change access specifier of data_ from private to protected
cout << info_ << endl;
}
};
int main() {
B b;
D d;
//b.data_ = 5; //Inaccessible to all (Error!!! even if access specifer is protected (as it works for derived class only)
b.print();
d.print();
return 0;
}
///************EXAMPLE-2***************///
class B { //Base class
protected:
int data_ = 1;
public:
friend ostream& operator<<(ostream& os, const B& b) {
os << "B Object : " << b.data_ << endl;
return os;
}
};
class D : public B { //Derived Class
private:
int info_ = 2;
public:
// friend ostream& operator<<(ostream& os, const D& d) {
// os << "B Object : " << d.data_ << endl;
// os << "D Object : " << d.info_ << endl; //accessible because "protected"
// return os;
// }
};
int main() {
B b;
D d;
cout << b;
cout << d; //calls base's operator function even if base's function accepts B's object (Implicit casting) (Note that Object d has class B's members as well in object layout)
/*
Output:
B Object : 1
B Object : 1
*/
return 0;
}
///************EXAMPLE-3***************///
class B { //Base class
protected:
int data_ = 1;
public:
friend ostream& operator<<(ostream& os, const B& b) {
os << "B Object : " << b.data_ << endl;
return os;
}
};
class D : public B { //Derived Class
private:
int info_ = 2;
public:
friend ostream& operator<<(ostream& os, const D& d) {
os << "B Object : " << d.data_ << endl;
os << "D Object : " << d.info_ << endl; //accessible because "protected"
return os;
}
};
int main() {
B b;
D d;
cout << b;
cout << d;
/*
Output:
B Object : 1
B Object : 1
D Object : 2
*/
return 0;
}