第1關(guān):公有繼承 —— 學(xué)生信息類
任務(wù)描述
本關(guān)任務(wù):采用公有繼承設(shè)計(jì)學(xué)生信息類。
相關(guān)知識
繼承
繼承是使代碼可以復(fù)用的重要手段,也是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心思想之一。簡單的說,繼承是指一個(gè)對象直接使用另一對象的屬性和方法。
C++ 中的繼承關(guān)系就好比現(xiàn)實(shí)生活中的父子關(guān)系,繼承一筆財(cái)產(chǎn)比白手起家要容易得多,原始類稱為基類,繼承類稱為派生類,基類是對派生類的抽象,派生類是對基類的具體化。它們是類似于父親和兒子的關(guān)系,所以也分別叫父類和子類。而子類又可以當(dāng)成父類,被另外的類繼承。
繼承方式
不同的繼承方式?jīng)Q定了基類成員在派生類中的訪問屬性,主要體現(xiàn)在:
-
派生類成員對基類成員的訪問權(quán)限;
-
通過派生類對象對基類成員的訪問權(quán)限。
對于派生類的成員或者派生類對象訪問自己類的成員不討論,跟一般類一樣,下面只討論對基類的成員的訪問。
-
公有繼承:基類的 public 和 protected 成員訪問屬性在派生類中保持不變;基類的 private 成員不可直接訪問。
-
保護(hù)繼承:基類的 public 和 protected 成員都以 protected 身份出現(xiàn)在派生類中;基類的 private 成員不可直接訪問。
-
私有繼承:基類的 public 和 protected 成員,都以 private 身份出現(xiàn)在派生類中;基類的 private 成員不可直接訪問。
可以看出無論采用何種繼承方式得到的派生類,派生類成員及其友元都不能訪問基類的私有成員。且一般情況,保護(hù)繼承與私有繼承在實(shí)際編程中極少使用,它們只在技術(shù)理論上有意義。
公有繼承
公有繼承是訪問性最高的一種繼承,在子類中能完整延續(xù)父類成員的訪問性,而且對外可見。如果要公有繼承一個(gè)類,只需繼承時(shí)在類名前面加上 public 關(guān)鍵字即可。
在公有繼承中,派生類成員可以訪問繼承的基類的 public 部分與 protected 部分,但是不能訪問 private 部分,只有基類成員以及基類的友元可以訪問 private 部分。
例如:
class Base
{
public:
int A;
};
class D1 : public Base // 公有繼承 Base 類
{
/* …… */
};
int main()
{
D1 d;
d.A = 10; // 訪問 D1 的基類 Base 中的 A 成員,因?yàn)槭枪欣^承,所以沒問題
}
編程要求
在右側(cè)編輯器中的Begin-End
之間補(bǔ)充代碼,設(shè)計(jì) Student 類,并實(shí)現(xiàn) Set 和 PrintSID 函數(shù),具體要求如下:
-
Student 類公有成員函數(shù):
void PrintSID()
,函數(shù)輸出成員變量 SID 的值,輸出格式為:學(xué)號:SID
。 -
普通函數(shù):
Set(int sid,string name,Student *ptr)
,它用前兩個(gè)參數(shù)設(shè)置 ptr 對象的 SID 和 Name(繼承 People 擁有的屬性)屬性值。
現(xiàn)在已有一個(gè)基類 People,它有一個(gè)公有成員變量姓名 Name,一個(gè)公有成員函數(shù) PrintName(函數(shù)的功能是打印出 Name 的值)。
class People
{
public:
string Name;
void PrintName();
};
void People::PrintName()
{
cout << "姓名:" << Name << endl;
}
測試說明
平臺(tái)會(huì)對你編寫的代碼進(jìn)行測試,比對你輸出的數(shù)值與實(shí)際正確數(shù)值,只有所有數(shù)據(jù)全部計(jì)算正確才能通過測試:
測試輸入:1 厲宏富
預(yù)期輸出:文章來源:http://www.zghlxwxcb.cn/news/detail-444889.html
學(xué)號:1
姓名:厲宏富
開始你的任務(wù)吧,祝你成功!
#include "people.h" // People 類定義在這里面
#include <string>
#include <iostream>
using namespace std;
/********** Begin **********/
//公有繼承 People
class Student:public People
{
public:
int SID;
void PrintSID();
};
/********** End **********/
void Student::PrintSID()
{
/********* Begin *********/
//輸出 SID
cout<<"學(xué)號:"<<SID<<endl;
/********* End *********/
}
void Set(int sid,string name,Student *ptr)
{
/********* Begin *********/
//給 ptr 對象的兩個(gè)屬性賦值
ptr -> SID = sid;
ptr -> Name = name;
/********* End *********/
}
第2關(guān):保護(hù)繼承 —— 學(xué)生信息類
任務(wù)描述
本關(guān)任務(wù):采用保護(hù)繼承設(shè)計(jì)學(xué)生信息類。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握保護(hù)繼承的使用。
保護(hù)繼承
保護(hù)繼承相對于公有繼承,訪問性有所降低,父類的公有成員在子類中變成了保護(hù)成員,也就無法在外部通過一個(gè)對象訪問父類成員了,但是對于這個(gè)子類的子類仍然是可見的(因?yàn)榭梢娦灾皇墙档搅?protected )。
如果要保護(hù)繼承一個(gè)類,只需繼承時(shí)在類名前面加上 protected 關(guān)鍵字即可。
例如:
class Base
{
public:
int A;
};
class D1 : protected Base // 保護(hù)繼承 Base 類
{
/* …… */
};
int main()
{
D1 d;
d.A = 10; // 嘗試訪問 D1 的基類 Base 中的 A 成員,但是由于是保護(hù)繼承,所以這樣做是錯(cuò)誤的。
}
在保護(hù)繼承中如果想通過子類訪問父類的成員,那就只能在子類中增加一些 get 、set 函數(shù)來實(shí)現(xiàn)了。
例如:
/* Base類的定義同上 */
class D1 : protected Base
{
public:
void SetA(int a); // 設(shè)置 Base 類中 A 的值
int GetA(); // 獲取 Base 類中 A 的值
};
void D1::SetA(int a)
{
A = a;
}
int D1::GetA()
{
return A;
}
int main()
{
Student st;
st.SetA(10); // 將 Base 類的 A 成員設(shè)置為 10
}
編程要求
在右側(cè)編輯器中的Begin-End
之間補(bǔ)充代碼,采用保護(hù)繼承設(shè)計(jì)學(xué)生信息類,并實(shí)現(xiàn) Set 和 PrintSID 函數(shù),具體要求如下:
-
Student 類公有成員函數(shù):
void PrintSID()
,函數(shù)輸出成員變量 SID 的值,輸出格式為:學(xué)號:SID
。 -
普通函數(shù):
Set(int sid,string name,Student *ptr)
,它用前兩個(gè)參數(shù)設(shè)置 ptr 對象的 SID 和 Name(繼承 People 擁有的屬性)屬性值。
現(xiàn)在已有一個(gè)基類 People,它有一個(gè)公有成員變量姓名 Name,一個(gè)公有成員函數(shù) PrintName(函數(shù)的功能是打印出 Name 的值)。
class People
{
public:
string Name;
void PrintName();
};
void People::PrintName()
{
cout << "姓名:" << Name << endl;
}
測試說明
平臺(tái)會(huì)對你編寫的代碼進(jìn)行測試,比對你輸出的數(shù)值與實(shí)際正確數(shù)值,只有所有數(shù)據(jù)全部計(jì)算正確才能通過測試:
測試輸入:1 嚴(yán)宏富
預(yù)期輸出:
學(xué)號:1
姓名:嚴(yán)宏富
開始你的任務(wù)吧,祝你成功!
#include "people.h" // People 類定義在這里面
#include <string>
#include <iostream>
using namespace std;
/********** Begin **********/
//保護(hù)繼承 People
class Student:protected People
{
public:
int SID;
void PrintSID();
//添加一個(gè) Set 函數(shù)來設(shè)置父類的 Name 成員
friend void Set(int sid,string name,Student *ptr);
};
/********* End *********/
void Student::PrintSID()
{
/********* Begin *********/
//輸出學(xué)號 SID
cout<<"學(xué)號:"<<SID<<endl;
/********* End *********/
}
void Set(int sid,string name,Student *ptr)
{
/********* Begin *********/
//給 ptr 對象的兩個(gè)屬性賦值
ptr -> SID = sid;
ptr -> Name = name;
/********* End *********/
}
第3關(guān):研究生信息類
任務(wù)描述
本關(guān)任務(wù):采用私有繼承完成學(xué)生信息類和研究生信息類的設(shè)計(jì)。
相關(guān)知識
為了完成本關(guān)任務(wù),你需要掌握私有繼承的使用。
私有繼承
私有繼承在保護(hù)繼承的基礎(chǔ)上更進(jìn)一步,訪問性進(jìn)一步降低,父類中的公有成員和保護(hù)成員的訪問性均降到了私有 private,不僅對外不可見,對這個(gè)類的子類也不可見了。
要私有繼承一個(gè)類,只需繼承時(shí)在類名前面加上 private 關(guān)鍵字即可。
例如:
/* 繼承關(guān)系:Base->D1->D2 */
class Base
{
public:
int A;
};
class D1 : private Base // 私有繼承 Base 類
{
public:
F1();
};
void D1::F1()
{
A = 10; // 父類的成員 A 可以看做 D1 類的私有成員,在 D1 類中訪問 A 是可行的
}
class D2 : public D1 // 公有繼承 D1
{
public:
F2();
};
void D2::F2()
{
A = 10; // 這里就不行了,因?yàn)?D1 類私有繼承了 Base 類,所以 Base 類的 A 成員對 D2 類就是不可見的。
}
同樣,如果想在某個(gè)類的外部或者它的子類中訪問它私有繼承的基類的成員,那也只能在這個(gè)類中增加 get、set 方法了。
例如:
/* Base類的定義同上 */
/* 繼承關(guān)系:Base->D1->D2 */
class D1 : private Base
{
public:
void SetA(int a); // 設(shè)置 Base 類中 A 的值
int GetA(); // 獲取 Base 類中 A 的值
};
void D1::SetA(int a)
{
A = a;
}
int D1::GetA()
{
return A;
}
class D2 : public D1 // 公有繼承 D1 類
{
public:
void F2();
}
void D2::F2()
{
SetA(10); // 調(diào)用 D1 類的 SetA 公有方法設(shè)置 Base 類 A 的值
}
編程要求
在右側(cè)編輯器中的Begin-End
之間補(bǔ)充代碼,設(shè)計(jì)學(xué)生信息類( Student )和設(shè)計(jì)研究生信息類( Graduate ),Graduate 類公有繼承 Student 類,而 Student 類私有繼承 People 類,并實(shí)現(xiàn)他們的成員函數(shù)以及一個(gè)普通函數(shù),具體要求如下:
- Graduate 類
增加一個(gè)成員變量研究方向:int ResearchID
,以及一個(gè)成員函數(shù):void PrintResearchID()
,函數(shù)用來輸出 ResearchID 的值,輸出格式為:研究方向:ResearchID
。
- Student 類
補(bǔ)充有成員函數(shù):void PrintSID()
,函數(shù)輸出成員變量 SID 的值,輸出格式為:學(xué)號:SID
。
- 普通函數(shù):
Set(int sid,int rid,string name,Graduate *ptr)
函數(shù),它用前三個(gè)參數(shù)設(shè)置 ptr 所指對象的三個(gè)成員。
People 基類,它有一個(gè)公有成員變量姓名 Name,一個(gè)公有成員函數(shù) PrintName(函數(shù)的功能是打印出 Name 的值),代碼如下:
/* 繼承關(guān)系:People->Student->Graduate */
class People
{
public:
string Name;
void PrintName();
};
void People::PrintName()
{
cout << Name << endl;
}
測試說明
平臺(tái)會(huì)對你編寫的代碼進(jìn)行測試,比對你輸出的數(shù)值與實(shí)際正確數(shù)值,只有所有數(shù)據(jù)全部計(jì)算正確才能通過測試:
測試輸入:1 304 厲宏富
預(yù)期輸出:
學(xué)號:1
姓名:厲宏富
研究方向:304
開始你的任務(wù)吧,祝你成功!文章來源地址http://www.zghlxwxcb.cn/news/detail-444889.html
#include "people.h" //People類定義在這里面
#include <string>
#include <iostream>
using namespace std;
/********* Begin *********/
//私有繼承 People 類
class Student:private People
{
public:
int SID;
void PrintSID();
//添加一個(gè) Set 函數(shù)來設(shè)置父類的 Name 成員
void Set(string name){
Name = name;
}
};
/********* End *********/
void Student::PrintSID()
{
/********* Begin *********/
//輸出學(xué)號 SID
cout<<"學(xué)號:"<<SID<<endl;
/********* End *********/
}
/********* Begin *********/
// 公有繼承 Student 類
class Graduate:public Student
{
public:
int ResearchID;
void PrintResearchID();
//添加一個(gè) Set 函數(shù)來設(shè)置父類的 SID 成員
friend void Set(string name,int sid,int rid,Graduate *ptr);
//添加一個(gè) Set 函數(shù)來調(diào)用父類的 SetName 函數(shù)
void set(string name){
Set(name);
}
};
/********* End *********/
void Graduate::PrintResearchID()
{
/********* Begin *********/
//輸出研究方向 ResearchID
cout<<"研究方向:"<<ResearchID<<endl;
/********* End *********/
}
void Set(string name,int sid,int rid,Graduate *ptr)
{
/********* Begin *********/
//設(shè)置 ptr 所指對象的三個(gè)成員
ptr->set(name);
ptr->SID = sid;
ptr->ResearchID = rid;
/********* End *********/
}
到了這里,關(guān)于頭歌Educoder實(shí)驗(yàn):C++ 面向?qū)ο?- 類的繼承與派生的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!