類的繼承就是子類可以擁有父類的成員變量和成員函數
//public 修飾的成員變量 方法 在類的內部 類的外部都能使用
//protected: 修飾的成員變量方法,在類的內部使用 ,在繼承的子類中可用 ;其他 類的外部不能被使用
//private: 修飾的成員變量方法 只能在類的內部使用 不能在類的外部。子類可以繼承,但不能使用
類的調用語法
class Parent { public: int a; protected: int b; private: int c; }; class Child : protected Parent { public: protected: private: };
一、不同的繼承方式會改變繼承成員的訪問屬性
1)C++中的繼承方式會影響子類的對外訪問屬性
public繼承:父類成員在子類中保持原有訪問級別
private繼承:父類成員在子類中變爲private成員
protected繼承:父類中public成員會變成protected
父類中protected成員仍然爲protected
父類中private成員仍然爲private
2)private成員在子類中依然存在,但是卻無法訪問到。不論種方式繼承基類,派生類都不能直接使用基類的私有成員 。
3)C++中子類對外訪問屬性表
|
父類成員訪問級別 |
|||
繼 承 方 式 |
|
public |
proteced |
private |
public |
public |
proteced |
private |
|
proteced |
proteced |
proteced |
private |
|
private |
private |
private |
Private |
二、兼容性原則
/*
兼容規則中所指的替代包括以下情況:
1)子類對象可以當作父類對象使用
2)子類對象可以直接賦值給父類對象
3)子類對象可以直接初始化父類對象
4)父類指針可以直接指向子類對象
5)父類引用可以直接引用子類對象
*/
#include <iostream> using namespace std; class Parent { public: void printP() { cout<<"我是爹..."<<endl; } Parent() { cout<<"parent構造函數"<<endl; } Parent(const Parent &obj) { cout<<"copy構造函數"<<endl; } private: int a; }; class child : public Parent { public: void printC() { cout<<"我是兒子"<<endl; } protected: private: int c; }; //C++編譯器 是不會報錯的 ..... void howToPrint(Parent *base) { base->printP(); //父類的 成員函數 } void howToPrint2(Parent &base) { base.printP(); //父類的 成員函數 } void main() { // Parent p1; p1.printP(); child c1; c1.printC(); c1.printP(); //賦值兼容性原則 //1-1 基類指針 (引用) 指向 子類對象 Parent *p = NULL; p = &c1; p->printP(); //1-2 指針做函數參數 howToPrint(&p1); howToPrint(&c1); //1-3引用做函數參數 howToPrint2(p1); howToPrint2(c1); //第二層含義 //可以讓子類對象 初始化 父類對象 //子類就是一種特殊的父類 Parent p3 = c1; cout<<"hello..."<<endl; system("pause"); return ; }
三、繼承中的構造析構調用原則
原則: 先構造父類,再構造成員變量、最後構造自己
先析構自己,在析構成員變量、最後析構父類
//先構造的對象,後釋放
四、繼承中的同名成員變量處理方法
1、當子類成員變量與父類成員變量同名時
2、子類依然從父類繼承同名成員
3、在子類中通過作用域分辨符::進行同名成員區分(在派生類中使用基類的同名成員,顯式地使用類名限定符)
4、同名成員存儲在內存中的不同位置