Class access specifiers - Very confusing programs - Help please

Hello friends,
I work in a MNC and as i was going through the C++ learning material, i came across the following inheritance program which i am really not able to understand.
The program comes under the topic "Class access specifiers".
The material says the statements which are commented are all ill-formed.
I understand what happens inside main but cannot figure out what happens inside the frb,fn and frd function.
My understanding of "abase *pb" is that it defines a pointer designed to point to an abase object

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
struct aderived; 
struct aderived2; 

struct abase
{ 
	abase() : pblc(0), prtd(0), prvt(0)
	{ cout<<"abase CTOR"<<endl;} 

	public: 		
		int pblc; 

	protected:				
		int prtd; 

	private: 		
		int prvt; 
	
		friend void frb(abase *pb, aderived *pd); 
}; 

struct aderived : abase
{ 
	aderived()
	{ cout<<"aderived CTOR"<<endl;}

	void fn(abase *pb, aderived* pd, aderived2 *pd2); 
	friend void frd(abase *pb, aderived *pd, aderived2 *pd2); 
}; 

struct aderived2 : aderived
{
aderived2()
{ cout<<"aderived2 CTOR"<<endl;} 
}; 

void frb(abase *pb, aderived *pd)
{
	cout<<"inside frb"<<endl; 
	pb->pblc++; 
	pb->prtd++; 
	pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	pd->prvt++; 
} 

void aderived::fn(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	cout<<"inside fn"<<endl;
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
} 

void frd(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	cout<<"inside frd"<<endl;
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
}

int main()
{ 
	abase b; 
	cout<<endl;
	
	aderived d; 
	cout<<endl;
	
	aderived2 d2; 
	cout<<endl;
	
	cout<<"inside main"<<endl;

	b.pblc++; 
	//b.prtd++; 
	//b.prvt++; 

	d.pblc++; 
	//d.prtd++; 
	//d.prvt++; 

	d2.pblc++; 
	//d2.prtd++; 
	//d2.prvt++; 
}

Output
abase CTOR

abase CTOR
aderived CTOR

abase CTOR
aderived CTOR
aderived2 CTOR

inside main


I think i understand the output. During the object creation the pointer to those objects are created and hence the output. But i really dont understand why the commented statements are ill-formed. Can anyone help me explaining it or links would also be helpful. Thanks.

Here are the progression examples of the topics which also i didnt understand.
Same but aderived2 has frd2 friend function

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
struct aderived; 
struct aderived2; 

struct abase
{ 
	abase() : pblc(0), prtd(0), prvt(0)
	{} 

	public: 		
		int pblc; 

	protected:				
		int prtd; 

	private: 		
		int prvt; 
	
		friend void frb(abase *pb, aderived *pd); 
}; 

struct aderived : abase
{ 
	void fn(abase *pb, aderived* pd, aderived2 *pd2); 
	friend void frd(abase *pb, aderived *pd, aderived2 *pd2); 
}; 

struct aderived2 : aderived
{
	friend void frd2(abase *pb, aderived *pd, aderived2 *pd2);
}; 

void frb(abase *pb, aderived *pd)
{ 
	pb->pblc++; 
	pb->prtd++; 
	pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	pd->prvt++; 
} 

void aderived::fn(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
} 

void frd(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++;
	//pd2->prvt++; 
}

void frd2(abase *pb, aderived *pd, aderived2 *pd2)
{
	pb->pblc++;
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++;
	//pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++;
	pd2->prtd++;
	//pd2->prvt++; 
}

int main()
{ 
	abase b; 
	aderived d; 
	aderived2 d2; 

	b.pblc++; 
	//b.prtd++; 
	//b.prvt++; 

	d.pblc++; 
	//d.prtd++; 
	//d.prvt++; 

	d2.pblc++; 
	//d2.prtd++; 
	//d2.prvt++; 
}


Next one is same but aderived is protected derivation of abase
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
# include<iostream.h>
using namespace std;
struct aderived; 
struct aderived2; 

struct abase
{ 
	abase() : pblc(0), prtd(0), prvt(0)
	{} 

	public: 		
		int pblc; 

	protected:				
		int prtd; 

	private: 		
		int prvt; 
	
		friend void frb(abase *pb, aderived *pd); 
}; 

struct aderived : protected abase //protected derivation
{ 
	void fn(abase *pb, aderived* pd, aderived2 *pd2); 
	friend void frd(abase *pb, aderived *pd, aderived2 *pd2); 
}; 

struct aderived2 : aderived
{
	friend void frd2(abase *pb, aderived *pd, aderived2 *pd2);
}; 

void frb(abase *pb, aderived *pd)
{ 
	pb->pblc++; 
	pb->prtd++; 
	pb->prvt++; 

	//pd->pblc++; 
	//pd->prtd++; 
	//pd->prvt++; 
} 

void aderived::fn(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
} 

void frd(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
}

void frd2(abase *pb, aderived *pd, aderived2 *pd2)
{
	pb->pblc++;
	//pb->prtd++; 
	//pb->prvt++; 

	//pd->pblc++; 
	//pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
}

int main()
{ 
	abase b; 
	aderived d; 
	aderived2 d2; 

	b.pblc++; 
	//b.prtd++; 
	//b.prvt++; 

	//d.pblc++; 
	//d.prtd++; 
	//d.prvt++; 

	//d2.pblc++; 
	//d2.prtd++; 
	//d2.prvt++; 
}


Next one is also same but aderived is private derivation of abase

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
# include<iostream.h>
using namespace std;
struct aderived; 
struct aderived2; 

struct abase
{ 
	abase() : pblc(0), prtd(0), prvt(0)
	{} 

	public: 		
		int pblc; 

	protected: 					
		int prtd; 

	private: 		
		int prvt; 
	
		friend void frb(abase *pb, aderived *pd); 
}; 

struct aderived : private abase //private derivation
{ 
	void fn(abase *pb, aderived* pd, aderived2 *pd2); 
	friend void frd(abase *pb, aderived *pd, aderived2 *pd2); 
}; 

struct aderived2 : aderived
{
	friend void frd2(abase *pb, aderived *pd, aderived2 *pd2);
}; 

void frb(abase *pb, aderived *pd)
{ 
	pb->pblc++; 
	pb->prtd++; 
	pb->prvt++; 

	//pd->pblc++; 
	//pd->prtd++; 
	//pd->prvt++; 
} 

void aderived::fn(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
} 

void frd(abase *pb, aderived *pd, aderived2 *pd2)
{ 
	pb->pblc++; 
	//pb->prtd++; 
	//pb->prvt++; 

	pd->pblc++; 
	pd->prtd++; 
	//pd->prvt++; 

	pd2->pblc++; 
	pd2->prtd++; 
	//pd2->prvt++; 
}

void frd2(abase *pb, aderived *pd, aderived2 *pd2)
{
	pb->pblc++;
	//pb->prtd++; 
	//pb->prvt++; 

	//pd->pblc++; 
	//pd->prtd++; 
	//pd->prvt++; 

	//pd2->pblc++; 
	//pd2->prtd++; 
	//pd2->prvt++; 
}

int main()
{ 
	abase b; 
	aderived d; 
	aderived2 d2; 

	b.pblc++; 
	//b.prtd++; 
	//b.prvt++; 

	//d.pblc++; 
	//d.prtd++; 
	//d.prvt++; 

	//d2.pblc++; 
	//d2.prtd++; 
	//d2.prvt++; 
}
Last edited on
Topic archived. No new replies allowed.