C++ 類中的3種訪問權限和繼承方式


訪問權限:public 可以被任意實體訪問,protected 只允許子類(無論什么繼承方式)及本類的成員函數訪問,private 只允許本類的成員函數訪問。三種繼承方式分別是 public 繼承,protect 繼承,private 繼承。

示例程序如下:

#include <iostream>
#include <String>

using namespace std;

// 基類
class student
{
public:
	string name;
protected:
	int age;
private:
	char sex;

public:
	void showStu()
	{
		cout << this->name << endl; // 1、在本類能夠訪問類的公有數據成員
		cout << this->age << endl;  // 1、在本類能夠訪問類的保護數據成員
		cout << this->sex << endl;  // 1、在本類能夠訪問類的私有數據成員
	}
};

// 派生類 - public繼承
class public_Sub : public student
{
public:
	void show()
	{
		cout << this->name << endl; // 2、public繼承,在派生類中能夠訪問基類的公有數據成員
		cout << this->age << endl;  // 2、public繼承,在派生類中能夠訪問基類的保護數據成員
		//cout << this->sex << endl;  // error:2、在c類中不能訪問基類的私有數據成員
	}
};

// 派生類 - protected繼承
class protected_Sub : protected student
{
public:
	void show()
	{
		cout << this->name << endl; // 3、protected繼承,在派生類中能夠訪問基類的公有數據成員
		cout << this->age << endl;  // 3、protected繼承,在派生類中能夠訪問基類的保護數據成員
		//cout << this->sex << endl;  // error:3、在派生類中不能訪問基類的私有數據成員
	}
};

// 派生類 - private繼承
class private_Sub : private student
{
public:
	void show()
	{
		cout << this->name << endl; // 4、private繼承,在派生類中能夠訪問基類的公有數據成員
		cout << this->age << endl;  // 4、private繼承,在派生類中能夠訪問基類的保護數據成員 【即使是private繼承】
		//cout << this->sex << endl;  // error:4、在派生類中不能訪問基類的私有數據成員
	}
};

int main()
{
	student stu;
	cout << stu.name << endl;   // 5、在類外可以訪問類的公有數據成員
	//cout << stu.age << endl;    // error,5、在類外不能訪問類的保護數據成員
	//cout << stu.sex << endl;    // error,5、在類外不能訪問類的私有數據成員

	return 0;
}
  • 派生類內不管是 public、protected、private 繼承,總是可以 public、protected 成員,基類中的 private 成員永遠不能再派生類內直接訪問,不論通過哪種方式。
  • 派生類對象僅當 public 派生時,對基類中的 public 成員有可訪問/可修改的權限,其他都為不可訪問/不可修改。

另外,繼承方式會改變從基類繼承的成員在派生類的訪問權限:

1、public 繼承不改變基類成員的訪問權限;

2、protected 繼承將基類中 public 成員變為子類的 protected 成員,其它成員的訪問權限不變;

3、private 繼承使得基類所有成員在子類中的訪問權限變為 private。


C++ 中為什么要定義 public、protect、private 這三種訪問權限?

有些我們需要給外面看的,也就是對外接口,那么就是 public。如果我們不想讓別人知道內部的實現細節,那么就是 private。如果我們不想讓別人知道,想讓自己的孩子什么的知道(這里涉及到繼承),那么就可以作為 protected。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM