類的繼承, 是新的類從已有類那裏獲得已有的特性。簡單來講,就是在原有類的基礎上作一些擴充。
定義方式:ios
class 派生類名:繼承方式 基類名1,繼承方式 基類名... { 派生類成員聲明; /*對除了從基類繼承來的成員以外,新增長的數據和函數成員的聲明*/ };
例子函數
class person//定義一個person類 { string name[6]; int age; char sex; }; class student:public person/*定義student類,公有繼承person類,那麼student裏面也有name、age、sex*/ { int id; int score; };
[attention]在派生過程當中構造函數和析構函數都不被繼承
沒有指明繼承方式時默認privatethis
公有繼承(public):基類的公有成員和保護成員在派生類中的訪問屬性不變,而基類的私有成員不可直接訪問
私有繼承(private):基類的公有成員和保護成員以私有成員身份出如今派生類中,而基類的私有成員在派生類中不可直接訪問
保護繼承(protected):基類的公有成員和保護成員以保護成員身份出如今派生類中,而基類的私有成員在派生類中不可直接訪問
---
呈現以下spa
繼承方式 | 子類訪問權限 | 類外對象訪問權限 |
---|---|---|
public | 能夠訪問public、protected | 能夠訪問public |
private | 能夠訪問public、protected | 沒法訪問 |
protected | 能夠訪問public、protected | 沒法訪問 |
具體例子code
#include"pch.h" #include<iostream> using namespace std; class Point { public: int getX() { return x; } int getY() { return y; } protected: void initial(int xx, int yy); private: int x, y; }; void Point::initial(int xx, int yy) { x = xx; y = yy; } class Rectangle:public Point/*此處爲公有繼承,稍後會對繼承方式進行改動*/ { public: int getWidth() { return width; } int getLength() { return length; } void initial_1(int length, int width, int x, int y) { initial(x, y);//此處代表公有繼承在派生類中能夠訪問基類的protected this->length = length; this->width = width; } private: int length, width; }; int main() { Rectangle rec; rec.initial_1(3, 2, 9, 5);//訪問基類的保護成員 cout << rec.getLength()<<endl; cout << rec.getX();//訪問基類的公有成員 return 0; }
對於公有繼承在類外的訪問
對象
對於私有和保護繼承在類外的訪問
blog
構造派生類的對象時,須要對基類的成員對象和新增成員對象進行初始化。但在繼承的過程當中,基類的構造函數不被繼承,因此派生類的構造函數中的一些參數就須要傳給基類的構造函數。
通常語法形式繼承
派生類名::派生類名(參數表):基類名1(基類1初始化參數表),...,基類名n(初始化n參數表) { 派生類構造函數的其餘初始化操做; }
派生類構造函數執行的通常次序:
(1)調用基類構造函數,調用順序按照他們被繼承時聲明的順序
(2)對派生類新增的成員對象初始化時,調用順序按照他們在類中聲明的順序
(3)執行派生類構造函數體中的內容get
#include"pch.h" #include<iostream> using namespace std; class A { public:A(int i)//有參數的構造函數 { cout << "constructing A " << i << endl; } }; class B { public:B(int j)//有參數的構造函數 { cout << "constructing B " << j << endl; } }; class C { public:C()//無參數的構造函數 { cout << "constructing C* " << endl; } }; class D :public A, public B, public C//公有繼承 { public:D(int a,int b,int c,int d):A(a),m1(d),m2(c),B(b) {} private:A m1; B m2 ; C m3; }; int main() { D d(1, 2, 3, 4); return 0; }
構造代碼結果
string
聲明語法形式
class 派生類名:virtual 繼承方式 基類名
以實例來講明
#include"pch.h" #include<iostream> using namespace std; class A { public: int a; void funa() { cout << "member of A" << endl; } }; class B:virtual public A//以A爲虛基類 { public: int b; }; class C :virtual public A//以A爲虛基類 { public: int c; }; class D :public B, public C//D是B和C,以A爲虛基類派生的 { public: int d; void fun() { cout << "member of D" << endl; } }; int main() { D d; //直接訪問虛基類的數據成員和函數成員 d.a = 2; d.funa(); return 0; }
虛基類代碼結果