C++繼承與派生訪問權限

觀察下邊一段代碼:

class A{
	public:
		void f1(){}
		int i;
	protected:
		void f2(){}
		int j;
	private:
		int k;
};
class B:public A{
	public:
		void f3(){}
	protected:	
		int m;
	private:
		int n;
};
class C:public B{
	public:
		void f4(){}
	private:
		int p;
};

全是公用繼承,思考這樣幾個問題:

1.在main函數中能否用b1.i,b1.j和b1.k引用派生類B對象b1中基類A的成員

2.派生類B中成員函數能否調用基類中的成員函數f1和f2.

3.派生類B中成員函數能否調用基類中的數據成員i,j,k.

4.能否在main函數中用c1.i,c1.j,c1.k,c1.m.cl.n,c1.p引用基類A的成員i,j,k,派生類B的成員m,n以及派生類C的成員p

5.能否在main函數中用c1.f1(),c1.f2(),c1.f3()和c1.f4()調用f1,f2,f3,f4c成員函數.

6.派生類C的成員函數f4能否調用基類A中的成員函數f1,f2和派生類中的成員函數f3.

答案在代碼中,思考幾分鐘再看.


#include<bits/stdc++.h>

using namespace std;

class A {
	public:
		void f1(){}//空函數得寫括號 
		int i;
	protected:
		void f2(){}//空函數得寫括號 
		int j;
	private:
		int k;
};
class B:public A {
	public:
		void f3() {
			//f1();
//			f2();f1在B類中是公有,f2是保護,可以直接在其派生類中調用
//		 	i = 1;//可以
//			 j = 1;//可以
//			 k = 1;	//可以
		}
	protected:
		int m;
	private:
		int n;
};
class C:public B {
	public:
		void f4(){
			f1();//可以 
			f2();//可以 
		}
	private:
		int p;
};

int main() {
	A a1;
	B b1;
	C c1;
	b1.i; //可以訪問;
	//b1.j; //不可以訪問,j是由通過公有繼承基類來的,j在 基類中的權限是保護,在派生類中也是保護,類外不能訪問被保護的數據成員。
	//b1.k;//k同理;
	// c1.j;  //不可以
//	c1.f1();//可以 
	c1.f3();//可以 
	c1.f4();//可以 
//	c1.f2(); //不可以f2是保護成員 
	c1.i;//可以
//	c1.j;//不可以 
//	c1.k;//不可以 
//	c1.n;//不可以 
//	c1.m; //不可以 
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章