C 基礎教程物件導向(學習筆記(48))

2021-08-30 04:34:39 字數 1348 閱讀 6426

在繼承課程的介紹中,我們提到使用派生類的最大好處之一是能夠重用已編寫的**。您可以繼承基類功能,然後新增新功能,修改現有功能或隱藏您不需要的功能。在接下來的幾節課中,我們將仔細研究這些事情是如何完成的。

首先,讓我們從乙個簡單的基類開始:

#include class base

void identify()

};

現在,讓我們建立乙個繼承自base的派生類。因為我們希望派生類能夠在例項化派生物件時設定m_value的值,所以我們將使derived建構函式在初始化列表中呼叫base建構函式。

class derived: public base

};

向派生類新增新功能

在上面的示例中,因為我們可以訪問base類的源**,所以如果需要,我們可以直接向base新增功能。

有時我們可以訪問基類但不想修改它。考慮剛剛從第三方**商處購買**庫但需要一些額外功能的情況。您可以新增到原始**,但這不是最佳解決方案。如果**商向您傳送更新怎麼辦?您的新增內容將被覆蓋,或者您必須手動將其新增到更新中,這既費時又有風險。

或者,有時甚至不可能修改基類。考慮標準庫中的**。我們無法修改標準庫中的**。但是我們能夠從這些類繼承,然後將我們自己的功能新增到派生類中。對於第三方庫,您也可以使用標題,但**是預編譯的。

在任何一種情況下,最好的答案是派生自己的類,並將所需的功能新增到派生類。

base類中的乙個明顯遺漏是public訪問m_value的一種方式。我們可以通過在base類中新增乙個訪問函式來解決這個問題 - 但是為了示例,我們將把它新增到派生類中。由於m_value已在base類中宣告為受保護,因此derived可以直接訪問它。

要向派生類新增新功能,只需在派生類中宣告該功能,就像正常一樣:

class derived: public base

int getvalue()

};

現在公眾將能夠在derived型別的物件上呼叫getvalue()來訪問m_value的值。

int main()

這會產生結果:

derived has value 5

雖然可能很明顯,但base型別的物件無法訪問derived中的getvalue()函式。以下不起作用:

int main()

這是因為base中沒有getvalue()函式。函式getvalue()屬於derived。因為derived是base派生類,所以derived可以訪問base中的內容。但是,base無法訪問derived中的任何內容。

C 基礎教程物件導向(學習筆記5(2))

在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...

C 基礎教程物件導向(學習筆記(23))

過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...

C 基礎教程物件導向(學習筆記(24))

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...