C++繼承方式


C++的繼承方式有三種,分別為:

    公有繼承:public
    私有繼承:private
    保護繼承:protected

定義格式為:

class<派生類名>:<繼承方式><基類名>
{
<派生類新定義成員>
};

我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。

在公有繼承(public)時,

基類的公有成員和保護成員作為派生類的成員時,
它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能
被這個派生類的子類所訪問。

#include<iostream>
using namespace std;
class People {
private:
	char *name = NULL;
	int ID;
	char *gender = NULL;
	float height;
public:
	People();
	People(char Name[], int id, char Gender[], float Height, char Address[]);
	int GetID();
	float Getheight();
	void DisplayPeople();
	char* Getname();
	char* Getgender();
	char* Getaddress();
protected:
	char *address = NULL;
};
People::People()
{

}
char* People::Getaddress()
{
	return address;
}
char* People::Getgender()
{
	return gender;
}
char* People::Getname()
{
	return name;
}
void People::DisplayPeople()
{
	cout << "姓名:" << name << endl;
	cout << "身份證號:" << ID << endl;
	cout << "性別:" << gender << endl;
	cout << "身高:" << height << endl;
	cout << "地址:" << address << endl;
}
People::People(char Name[], int id, char Gender[], float Height, char Address[])
{
	name = Name;
	ID = id;
	gender = Gender;
	height = Height;
	address = Address;
}
int People::GetID()
{
	return ID;
}
float People::Getheight()
{
	return height;
}
class Student :public People//類Student以公有繼承的方式繼承類People
{
private:
	int StudentId;
	char *Class;
public:
	Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
	void DisplayStudent();
	Student();
	float GetHeight();
};
float Student::GetHeight()
{
	return Student::Getheight();
}
Student::Student()
{

}
void Student::DisplayStudent()
{
	cout << endl;
	People::DisplayPeople();
	cout << "學生學號:" << StudentId << endl;
	cout << "學生所在班級:" << Class << endl;
}
Student::Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]) :People(Name, id, Gender, Height, Address)
//派生類的構造函數 
{
	StudentId = studentid;
	Class = clas;
}
int main()
{
	char s1[20];
	cout << "輸入姓名 :";
	cin >> s1;//輸入姓名 
	char s2[10];
	cout << "輸入性別 :";
	cin >> s2;//輸入性別 
	char s3[15];
	cout << "輸入地址 :";
	cin >> s3;//輸入地址 
	int a;
	cout << "請輸入身份證號:";
	cin >> a;
	float b ;
	cout << "請輸入身高:";
	cin >> b;
	People people(s1, a, s2, b, s3);
	char S1[20];
	cout << "輸入所在班級 :";
	cin >> S1;//輸入所在班級 
	int number;
	cout << "輸入學號 :";
	cin >> number;//輸入學號 
	Student student1(s1, a, s2, b, s3, number, S1);
	student1.DisplayStudent();//派生類調用基類中的public成員函數 
	cout << endl << student1.Getheight() << endl;//派生類調用基類的成員函數訪問基類的私有成員height 
	system("pause");
	return 0;
}

這個派生類采用公有繼承方式,所以可以調用基類中的成員函數。但若我們用派生類直接訪問基類中的私有成員,

cout << student1.ID << endl;

則會出現以下錯誤:

說明派生類也不可直接訪問基類中的私有成員。

在私有繼承(private)時,

基類的公有成員和保護成員都作為派生類的私有
成員,並且不能被這個派生類的子類所訪問。

在上面代碼不變的基礎上,將繼承方式由公有繼承(public)改為私有繼承(private),

class Student :private People//類Student以私有繼承的方式繼承類People
{
private:
	int StudentId;
	char *Class;
public:
	Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
	void DisplayStudent();
	Student();
	float GetHeight();
};

會發生如下報錯:

說明在私有繼承中,基類中的成員函數對於派生類來說是不可見的,不被允許訪問的,若我們想訪問基類中的
私有成員變量,可以通過派生類成員函數間接地訪問,代碼如下:

float Student::GetHeight()
{
	cout << endl<< "訪問基類成員height成功:";
	return Student::Getheight();
}

在派生類函數中,我們調用了基類成員函數成功訪問了基類私有成員。

在保護繼承(protected)時,

基類的所有公有成員和保護成員都成為派生類
的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員
仍然是私有的。

將繼承方式改為保護繼承(protected),

class Student :protected People//類Student以保護繼承的方式繼承類People
{
private:
	int StudentId;
	char *Class;
public:
	Student(char Name[], int id, char Gender[], float Height, char Address[], int studentid, char clas[]);
	void DisplayStudent();
	Student();
	float GetHeight();
};

此時,當我們通過派生類訪問基類成員函數時,

cout << student1.DisplayPeople() << endl;
cout << student1.Getgender() << endl;

報錯提示函數DisplayPeople() ,Getgender()不能被直接訪問,因為在保護繼承方式中,基類的public成員
對於派生類而言是protected成員,不能被直接訪問。

若我們想要訪問,可以通過構造派生類的成員函數訪問,如下:

char* Student::GetPeopleName()
{
	return People::Getname();
}

結語

通過對累的派生,我們可以使一個類的屬性多樣化,也有利於我們后期的設計。


免責聲明!

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



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