1)基本知識點ios
在C++中,派生類的通常定義語法爲:函數
class 派生類名:繼承方式 基類名1,繼承方式 基類名2,繼承方式 基類名3,……,繼承方式 基類名n { 派生類成員聲明; };
其中繼承方式規定了如何訪問從基類繼承的成員。繼承方式關鍵字爲:public,private和protected,分別表示公用繼承,私有繼承和保護繼承。若是不顯式地給出繼承方式關鍵字,系統地默認值就認爲是私有繼承。this
2)重要知識點spa
認真翻閱了繼承這一章,我認爲重要的知識點主要集中在訪問控制上,下面經過實驗來進行檢驗。code
公有繼承,私有繼承,保護繼承的區別:blog
公有繼承:繼承
#ifndef Point_h #define Point_h class Point { public: void initPoint (float x=0,float y=0){this->x =x ;this->y=y;} void move(float offX,float offY) {x+=offX; y+=offY;} float getX() const{return x;} float getY() const{return y;} private: float x,y; }; #endif /* Point_h */ #ifndef Rectangle_h #define Rectangle_h #include "Point.h" class Rectangle:public Point { public: void initRectangle(float x,float y,float w,float h){ initPoint(x,y); this->w=w; this->h=h; } float getH()const {return h;} float getW()const {return w;} private: float w,h; }; #endif /* Rectangle_h */ #include <iostream> #include <cmath> #include "Rectangle.h" using namespace std; int main(){ Rectangle rect; rect.initRectangle(2, 3, 20, 10); rect.move(3, 2); cout<<"The data of rect(x,y,w,h): "<<endl; cout<<rect.getX()<<"," <<rect.getY()<<"," <<rect.getW()<<"," <<rect.getH()<<","<<endl; return 0; }
輸出結果:get
私有繼承和保護繼承在直接繼承中的結果是同樣的:it
#ifndef Point_h #define Point_h class Point { public: void initPoint (float x=0,float y=0){this->x =x ;this->y=y;} void move(float offX,float offY) {x+=offX; y+=offY;} float getX() const{return x;} float getY() const{return y;} private: float x,y; }; #endif /* Point_h */ #ifndef Rectangle_h #define Rectangle_h #include "Point.h" class Rectangle:protected Point { //這裏用private來控制繼承方式結果徹底相同 public: void initRectangle(float x,float y,float w,float h){ initPoint(x,y); this->w=w; this->h=h; } float getH()const {return h;} float getW()const {return w;} //下面是新增代碼 void move(float offX,float offY){Point::move(offX,offY);} float getX() const {return Point::getX();} float getY() const {return Point::getY();} private: float w,h; }; #endif /* Rectangle_h */ #include <iostream> #include <cmath> #include "Rectangle.h" using namespace std; int main(){ Rectangle rect; rect.initRectangle(2, 3, 20, 10); rect.move(3, 2); cout<<"The data of rect(x,y,w,h): "<<endl; cout<<rect.getX()<<"," <<rect.getY()<<"," <<rect.getW()<<"," <<rect.getH()<<","<<endl; return 0; }
輸出結果與上面徹底同樣。io
儘管私有繼承與保護繼承在直接派生中的結果相同,但在間接派生中是有區別的。
#ifndef square_h #define square_h #include "Rectangle.h" class square:private Rectangle { public: void initsquare(float x,float y,float w,float h){ initPoint(x,y); this->w=w; this->h=h; } float getH()const {return h;} float getW()const {return w;} void move(float offX,float offY){Point::move(offX,offY);} float getX() const {return Point::getX();} float getY() const {return Point::getY();} private: int j,k; } #endif /* square_h */
以私有繼承的方式來繼承point。不管square以哪一種方式繼承Rectangle,想在square中直接訪問Point類裏的initsquare函數,都會直接報錯。
而若是以保護繼承的方式來繼承point。square除了private的方式繼承Rectangle外(public、protected),均可以在類裏經過類名直接訪問Point類裏的initsquare函數。
經過以上實驗咱們能夠知道若是以保護繼承的方式繼承基類,除了(被保護的)派生類能夠訪問基類之外,絕對不可能被外部使用者訪問。
若是合理地利用保護成員,就能夠在類的複雜層次關係中在共享與成員隱蔽之間找到一個平衡點,既能實現成員隱蔽,又能方便繼承。