1、派生類的對象存儲了基類的數據成員。派生類對象可以使用基類的方法。
2、繼承特性中派生類要添加什么? (1)派生類類需要有自己的構造函數 (2)派生類可以添加成員或方法 (3)構造函數必須給新成員和繼承的成員提供數據
3、關于構造函數訪問權限的考慮
(1)今天在書上看到一個關于構造函數為什么不能被繼承的原因。
構造函數不同意其他類方法,因為它創建新的對象,而其他類方法只有被現有的對象調用。這是構造函數不能被調用的原因之一。繼承意味著派生類對象可以使用基類的方法,然而,構造函數在完成其工作之前,對象并不存在。
(2)派生類不能直接訪問基類的私有成員,而必須通過基類方法來進行訪問,導致派生類構造函數必須調用基類構造函數。
有關派生類構造函數要點如下: (1)首先創建基類對象 (2)派生類構造函數通過成員初始化列表來將基類信息傳遞給基類構造函數。 (3)派生類構造函數應該初始化新增的數據成員。
#include <iostream>using namespace std;class Base{public: Base() { cout << "base " << endl; } ~Base() { cout << "base destory" << endl; } void PRint() { cout << "Base print" << endl; }};class Derived : public Base{public: Derived() { cout << "Derived " << endl; } Derived(int x):dd(x),Base() { cout << dd << endl; } ~Derived() { cout << "deriverd destory" << endl; }private: int dd;};int main(){ Derived temp(5); return 0;}【注意】:創建派生類時,程序首先調用基類的構造函數,在調用派生類的構造函數?;悩嬙旌瘮地撠煶跏蓟^承的數據成員;派生類構造函數主要用于初始化新增的數據成員。派生類的構造函數總是調用一個基類的構造函數。可以使用初始化列表指明要使用的基類構造函數,否則將使用默認的基類構造函數。
(3)派生類和基類的特殊關系
派生類可以使用基類的方法基類指針或者引用可以在不進行顯示類型的情況下指向或引用派生類基類指針或引用只能調用基類方法,不可以基類對象或者地址賦值給派生類引用和指針。
4、繼承 c++繼承的三種方式:公有繼承、私有繼承、保護繼承 繼承時is-a的關系,即派生類對象時基類的一個對象。
5、多態公有繼承
兩種重要的機制實現公有繼承: (1)在派生類中重新定義基類方法 (2)使用虛方法
書中關于使不使用virtual的解釋: (1)如果方法是通過引用或者指針而不是對象調用的,沒有使用virtual,它將根據引用類型或者指針類型選擇方法。 如果使用virtual,程序將根據引用或者指向的對象的類型,選擇方法。
(2)如果方法在基類中被聲明為虛之后,它在派生類中自動成為虛方法。
【注意】:如果在派生類中重新定義基類的方法,通常應將基類方法聲明為虛的。
6、靜態聯編和動態聯編。 靜態聯編:在編譯階段就已確定的調用的方法 動態聯編:在程序執行階段才確定要使用的方法(virtual是動態聯編)
7、虛函數的注意事項
(1)構造函數不能是虛函數 (2)友元不能是虛函數,因為友元不是類成員,而只有成員才能是虛函數。 (3)沒有重新定義,將使用基類版本。 (4)重新定義將隱藏方法
8、當類聲明中包含純虛函數時,則不能創建該類的對象。 包含純虛函數的類只能用在基類。
9、繼承和動態分配內存
基類中有new (1)派生類中沒有使用new,派生類調用基類的析構函數、拷貝構造函數】賦值運算符 (2)派生類中使用new ,必須顯示定義析構函數,拷貝構造函數,賦值運算符
新聞熱點
疑難解答
圖片精選