C++:基类和派生类
? ?4.1 派生類的聲明
繼承實例如下: class Person{ //聲明基類Person public:void print(){cout<<"name:"<<name<<endl;cout<<"age:"<<age<<endl;cout<<"sex:"<<sex<<endl;}protected:string name;int age;char sex; }; class Employee:public Person{ //聲明派生類Employee公有繼承了基類Person public:void print1() //新增成員函數 {print();cout<<"department:"<<department<<endl; cout<<"salary:"<<salary<<endl; }private:string department; //新增數據成員int salary; //新增數據成員 };聲明一個派生類的一般格式是:
Class 派生類 : [繼承方式] 基類名{
派生類新增加的數據成員和成員函數
};
說明: 基類名為聲明的父類,派生類為子類
繼承方式分三種:public、private、protected
4.1.3 派生類的構成
(1)派生類從基類接收成員
在C++的類繼承中,派生類把基類的全部成員函數(除了構造函數和析構函數)接收過來
(2)調整從基類接收的成員
一方面改變基類成員在派生類中的訪問屬性,主要通過聲明時的繼承方式來控制;
另一面派生類可以對基類中的函數進行重定義,即覆蓋基類中的同名函數。
(3)在派生類中新增成員
新增的成員可以是數據成員,也可以是成員函數
注意:基類的構造函數和析構函數不能被繼承,一般需要派生類聲明自己的構造函數和析構函數。
4.1.4 基類成員在派生類中的訪問屬性
派生類可以繼承除了構造函數與析構函數之外的成員,但是這些成員的訪問屬性在派生過程中
是可以調整的。從基類繼承來的成員在派生類中的訪問屬性是由繼承方式控制的。
類的繼承方式有public公有繼承、protected保護繼承、private私有繼承三種。不同的繼承方式
導致不同訪問屬性的基類成員在派生類在派生類中的訪問屬性也有所不同。
在派生類中,從基類繼承來的成員可以按訪問屬性劃分為四種:不可直接訪問、公有public、
保護protected、私有private。
表4.1 基類成員在派生類中的訪問屬性
————————————————————————————————————————————————
基類中的成員| 在公有派生類中的訪問屬性| 在私有派生類中的訪問屬性 | 在保護派生類中的訪問屬性
————————————————————————————————————————————————
私有成員 | 不可直接訪問 | 不可直接訪問 | 不可直接訪問
公有成員 | 公有 ? ? ? ? ? ? ? ? | 私有 ? ? ? ? ? ? ? ? | 保護
保護成員 | 保 ? ? ? ? ? ? ? ? ? ? | 私有 ? ? ? ? ? ? ? ? | 保護
————————————————————————————————————————————————
從表4.1中可以歸納出以下幾點
(1) 基類中的私有成員。
無論哪種繼承方式,基類中的私有成員不允許派生類繼承,即在派生類中是不可直接訪問的。
(2) 基類中的公有成員
a.當類的繼承方式為公有繼承時,基類中的所有公有成員在派生類中仍以公有成員的身份出現。
b.當類的繼承方式為私有繼承時,基類中的所有公有成員在派生類中仍以私有成員的身份出現
c.當類的繼承方式為保護繼承時,基類中的所有公有成員在派生類中仍以保護成員的身份出現。
(3)基類中保護成員。
a.當類的繼承方式為公有繼承時,基類中的所有公有成員在派生類中仍以保護成員的身份出現。
b.當類的繼承方式為私有繼承時,基類中的所有公有成員在派生類中仍以私有成員的身份出現。
c.當類的繼承方式為保護繼承時,基類中的所有公有成員在派生類中仍以保護成員的身份出現。
4.1.5 派生類對基類成員的訪問規則
基類的成員可以有public、protected、private三種訪問屬性,基類的成員函數可以訪問基類中其它
成員,但是在基類外通過基類的對象,就只能訪問基類的公有成員。
同樣,派生類的成員也可以有public、protected、private三種訪問屬性,派生類的成員函數可以訪問
派生類中自己增加的成員,但是在派生類外通過基類的對象,就只能訪問該派生類的公有成員
。
派生類對基類成員的訪問形式主要有以下兩種:
(1)內部訪問。由派生類中新增的成員函數對從基類繼承來的成員的訪問。
(2)對象訪問。在派生類外部,同過派生類的對象對從基類繼承來的成員的訪問。
表4.2 私有繼承的訪問規則(private)
-----------------------------------------------------------------
基類中的成員 | 稀有成員 | 共有成員 ?|保護成員
-----------------------------------------------------------------
內部訪問 ? ? ?| 不可訪問 ?| 可訪問 ? ? ?| 可訪問
對象訪問 ? ? ?| 不可訪問 ?| 不可訪問 ?| 不可訪問
-----------------------------------------------------------------
//例4.1私有繼承的訪問規則舉例1
#include<iostream> using namespace std; class Base{ //聲明基類 public:void setx(int n) //正確,成員函數setx可以訪問本類中的私有成員x {x = n;}void showx() //正確,成員函數showx可以訪問本類中的私有成員x {cout<<x<<endl;}private:int x; }; class Derived:private Base{ //聲明基類Base的私有派生類Derived public:void setxy(int n,int m) {setx(n); //正確,基類的setx函數在派生類中為私有成員,派生類中的成員函數可以訪問 y = m; //正確,成員函數setxy可以訪問本類中的私有成員y }void showxy(){//cout<<x; //錯誤,派生類中的成員函數不能直接訪問基類中的私有成員showx(); //正確,基類的showx函數在派生類中為私有成員,派生類中的成員函數可以訪問 cout<<y<<endl; //正確,成員函數showxy可以直接訪問本類中的私有成員y }private:int y; }; int main() {Derived obj;//obj.setx(10); //錯誤,setx在派生類中為私有成員,派生類對象不能直接訪問。 //obj.showx(); //錯誤,showx在派生類中為私有成員,派生類對象不能直接訪問。obj.setxy(20,30); //正確,setxy在本類Derived中為公有成員,派生類對象能直接訪問。 obj.showxy(); //正確,showxy在本類Derived中為公有成員,派生類對象能直接訪問return 0; } /*說明:可見基類中的私有成員既不能被派生類的對象訪問,也不能被派生類中的成員函數訪問。即不可訪問成員,因此,在設計基類時,總要為它的私有數據提供公有成員函數,如在本例的成員函數showx等,以便使派生類可以間接訪問這些成員。 *///私有繼承的訪問規則舉例2
#include<iostream> using namespace std; class Base{ //聲明基類Base public:void seta(int sa) //正確,成員函數seta可以訪問本類中的保護成員a {a = sa;}void showa(){cout<<"a="<<a<<endl; //正確,成員函數showa可以訪問本類中的保護成員a }protected:int a; }; class Derive1:private Base{ //聲明基類Base的私有派生類Derive1 public:void setab(int sa,int sb){a = sa; //正確,a在派生類中為私有成員,派生類成員函數可以訪問 b = sb; //正確,b在派生類中為保護成員,派生類成員函數可以訪問 } void showab(){showa();//cout<<"a="<<a<<endl; //正確,a在派生類中為私有成員,派生類成員函數可以訪問 cout<<"b="<<b<<endl; //正確,a在派生類中為保護成員,派生類成員函數可以訪問 }protected:int b; }; class Derive2:private Derive1{ //聲明類Derive1的私有派生類Derive2public:void setabc(int sa,int sb,int sc){setab(sa,sb); //正確,setab函數在派生類Derive2中為私有成員,成員函數setabc可以訪問c = sc; }void showabc(){showab(); //正確,showab函數在派生類Derive2中為私有成員,成員函數showabc可以訪問//cout<<"a="<<a<<endl; //錯誤,a在類Derive2中為不可直接訪問成員 //cout<<"b="<<b<<endl; //正確,b在類Derive2中為私有成員 cout<<"c="<<c<<endl; //正確,c在類Derive2中為私有成員 }private:int c; }; int main() {Base op1;op1.seta(1);op1.showa();Derive1 op2;op2.setab(2,3);op2.showab();Derive2 op3;op3.setabc(4,5,6);op3.showabc();return 0; } /* 說明:經過了私有繼承后,所有基類中的成員都成為了派生類的私有成員或不可直接訪問的成員,如果進一步派生的話,基類的全部成員都無法在新的派生類中被訪問。因此,私有繼承之后,基類的成員無法在以后的派生類中在發揮作用,實際是相當于中止了基類功能的繼承派生,出于這種原因,私有繼承的實際應用很少。 */
表4.2 保護繼承的訪問規則(protected)
-----------------------------------------------------------------
基類中的成員 | 稀有成員 ? | 共有成員 ? |保護成員
-----------------------------------------------------------------
內部訪問 ? ? ? ? | 不可訪問 ? | 可訪問 ? ? ? | 可訪問
對象訪問 ? ? ? ? | 不可訪問 ? | 可訪問 ? ? ? | 不可訪問
-----------------------------------------------------------------
//例 4.4 保護繼承的訪問規則
表4.2 公有繼承的訪問規則(public)
-----------------------------------------------------------------
基類中的成員 | 稀有成員 ? ? ?| 共有成員 ? ? ? ?|保護成員
-----------------------------------------------------------------
內部訪問 ? ? ? ?| 不可訪問 ? ? ? | 可訪問 ? ? ? ? ? ? | 可訪問
對象訪問 ? ? ? ?| 不可訪問 ? ? ? | 可訪問 ? ? ? ? ? ? | 不可訪問
-----------------------------------------------------------------
//例4.3 公有繼承的訪問規則
?
總結
以上是生活随笔為你收集整理的C++:基类和派生类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP MySql数据库访问
- 下一篇: 自动化测试如何解决验证码的问题