類的繼承重難點

2021-08-21 20:51:29 字數 2839 閱讀 4963

繼承許可權:

不同的繼承方式會影響基類成員在派生類中的訪問許可權。

public繼承方式

基類中所有 public 成員在派生類中為 public 屬性;

基類中所有 protected 成員在派生類中為 protected 屬性;

基類中所有 private 成員在派生類中不能使用。

protected繼承方式

基類中的所有 public 成員在派生類中為 protected 屬性;

基類中的所有 protected 成員在派生類中為 protected 屬性;

基類中的所有 private 成員在派生類中不能使用。

private繼承方式

基類中的所有 public 成員在派生類中均為 private 屬性;

基類中的所有 protected 成員在派生類中均為 private 屬性;

基類中的所有 private 成員在派生類中不能使用。

通過上面的分析可以發現:

1) 基類成員在派生類中的訪問許可權不得高於繼承方式中指定的許可權。例如,當繼承方式為 protected 時,那麼基類成員在派生類中的訪問許可權最高也為 protected,高於 protected 的會降級為 protected,但低於 protected 不會公升級。再如,當繼承方式為 public 時,那麼基類成員在派生類中的訪問許可權將保持不變。

也就是說,繼承方式中的 public、protected、private 是用來指明基類成員在派生類中的最高訪問許可權的。

2) 不管繼承方式如何,基類中的 private 成員在派生類中始終不能使用(不能在派生類的成員函式中訪問或呼叫)。

3) 如果希望基類的成員能夠被派生類繼承並且毫無障礙地使用,那麼這些成員只能宣告為 public 或 protected;只有那些不希望在派生類中使用的成員才宣告為 private。

4) 如果希望基類的成員既不向外暴露(不能通過物件訪問),還能在派生類中使用,那麼只能宣告為 protected。

注意,我們這裡說的是基類的 private 成員不能在派生類中使用,並沒有說基類的 private 成員不能被繼承。實際上,基類的 private 成員是能夠被繼承的,並且(成員變數)會占用派生類物件的記憶體,它只是在派生類中不可見,導致無法使用罷了。private 成員的這種特性,能夠很好的對派生類隱藏基類的實現,以體現物件導向的封裝性。

#include #include using namespace std;

class a

void set(int a, int b, int c)

};class b : public a

;shape::shape(double _x, double _y)

double shape::getarea()

class circle : public shape

;circle::circle(double r) : shape(r, r)

double circle::getarea()

double circle::getradius()

class rectangle : public shape

;rectangle::rectangle(double l, double w) : shape(l, w)

double rectangle::getarea()

double rectangle::getlength()

double rectangle::getwidth()

int main()

~object()

private:

int a;}; 

class parent

~parent()

private:

int a;

int b;

};class child : public parent

~child()

private:

int c;

object obj1;

object obj2;}; 

int main()

return 0;

}

派生類中的static關鍵字:基類定義的靜態成員,將被所有派生類共享

根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質 (遵守派生類的訪問控制)

派生類中訪問靜態成員,用以下形式顯式說明:

類名 :: 成員。

或通過物件訪問   物件名 . 成員 。

注意要給static 後面的東西分配記憶體。

多繼承的派生類的構造和訪問:

多個基類的派生類建構函式可以用初始式呼叫基類建構函式初始化資料成員

執行順序與單繼承建構函式情況類似。多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。

乙個派生類物件擁有多個直接或間接基類的成員。不同名成員訪問不會出現二義性。如果不同的基類有同名成員,派生類物件訪問時應該加以識別。

虛繼承

如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。

如果在多條繼承路徑上有乙個公共的基類,那麼在繼承路徑的某處匯合點,這個公共基類就會在派生類的物件中產生多個基類子物件。

要使這個公共基類在派生類中只產生乙個子物件,必須對這個基類宣告為虛繼承,使這個基類成為虛基類。

虛繼承宣告使用關鍵字       virtual

python類的繼承重構 python類繼承與重構

python類繼承與重構 0 物件 通過類定義的資料結構例項。物件包括兩個資料成員 類變數和例項變數 和方法。usr bin python coding utf 8 class employee 所有員工的基類 empcount 0 def init self,name,salary self.na...

java 繼承 重寫

package inheritance.override 1 先開闢空間 2 再呼叫構造器 父類宣告賦值 父類構造器 子類宣告賦值 子類構造器 3 返回位址 屬性 就近原則 父類中的方法 如果重寫 找重寫,沒有重寫 找父類 新增不可見 先編譯後執行 編譯 從 所屬的當前類中向上找object 就近最...

繼承 重寫 super

繼承 extends,子類自動擁有父類的所有可繼承的屬性和方法。只支援單繼承,不可多重繼承,如 extends a,b 是錯誤的。可以多層繼承。重寫 子類重寫父類的方法時,不能使用比父類中被重寫的方法更嚴格的訪問許可權。super 1 呼叫父類成員變數 成員方法 super.成員變數 super.成...