繼承是一個永恒的話題,可是帶來的問題卻也是多多啊。最近一直在思考一些細節(jié)的東西,于是也有了不少收獲。今天,當我想要用派生類訪問基類的私有成員時,發(fā)現(xiàn)問題了……
代碼1:(沒有問題,對照下面的代碼來看錯誤之處)
1
#include <iostream>
2
using namespace std;
3
class B;
4
class A
{
5
int b;
6
public:
7
friend class B;
8
int a;
9
A(int x):a(x)
{ b = a+1;}
10
};
11
class B:public A
{
12
public:
13
void print();
14
B(int x):A(x)
{} //基類定義了一個有參的構造函數(shù)時,派生類必須定義構造函數(shù)
15
};
16
void B::print()
17

{
18
cout << B::a << endl;
19
cout << B::b << endl;
20
}
21
22
int main()
23

{
24
B b(4);
25
b.print();
26
}
27
這里可以看到,結果是正確的,而且還能夠訪問到基類的私有成員b,證明了自己的想法。其中,將派生類都作為了基類的友元,這個范圍未免有點大了,好吧,我縮小點,(問題來了……)
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

問題代碼:
1
#include <iostream>
2
using namespace std;
3
class B;
4
class A
{
5
int b;
6
public:
7
int a;
8
A(int x):a(x)
{ b = a+1;}
9
friend void B::print();
10
};
11
class B:public A
{
12
public:
13
void print();
14
B(int x):A(x)
{} //基類定義了一個有參的構造函數(shù)時,派生類必須定義構造函數(shù)
15
};
16
17
18
void B::print()
19

{
20
cout << B::a << endl;
21
cout << B::b << endl;
22
}
23
24
int main()
25

{
26
B b(4);
27
b.print();
28
}
變化后的代碼僅僅就是將類B的print函數(shù)作為基類A的友元,這樣,按照道理來說,應該也是可以訪問基類的私有成員的。而且從上面那個正確的代碼來看,聲明為友元之后,確實是可以突破訪問權限的,然后,此代碼有錯誤,顯示的就是私有成員的不可訪問。
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

一時間感覺世界有點不真實了…………
-------------------------------目前原因正在思考中,如果哪個過客知道答案,后者有自己的見解,不妨占用下你寶貴的時間,留個言吧。
(注記:個人認為,印象中《C++ Primer》中講到在聲明類的成員函數(shù)為另外一個類的友元時,需要先定義這個類,而如果是派生類的話,可以聲明下,等后來再定義。這個也是代碼1的做法,沒有問題。所以我覺得可能是如果用下面的代碼,那么沒有先定義類B,而聲明了它的成員函數(shù)print,所以有問題。待求證……)
結束:
感謝Sunshine Alike ,我覺得他的解釋可能是比較合理的,摘抄如下,如果有誤,歡迎留言指正。。


