什么是繼承
(1)繼承是C++源生支持的一種語法特性,是C++面向對象的一種表現
(2)繼承特性可以讓派生類“瞬間”擁有基類的所有(當然還得考慮權限)屬性和方法
(3)繼承特性本質上是為了代碼復用
(4)類在C++編譯器的內部可以理解為結構體,派生類是由基類成員疊加派生類新成員得到的
派生類又叫子類,基類又叫父類。兩種叫法都有人常用,我們后面會混用,鍛煉大家瞬間了然的能力
繼承中的權限管控
C++類中的訪問權限管控回顧
(1)public 類內部可以訪問,類的外部可以訪問
(2)private 類內部可以訪問,類的外部不能訪問
(3)protected 類內部可以訪問,類的外部不能訪問
1、父類的private成員,在三種繼承下都會被變成在子類中是比private還可憐的這種成員
2、父類的public成員,在public繼承下到子類中還是public,在protected繼承下到子類中是protected的,在private繼承下到子類中是private的。
3、父類的protected成員,在public繼承下到子類中是protected的,在protected繼承下到子類中是protected的,在private繼承下到子類中是private的。
4、private:如果是父類中的private權限成員,那么在繼承時會被降到比private還慘的這種;而如果是private繼承,則不會導致父類中public和protected的成員降權到比private還慘的這種,只會降級到private權限。
5、在繼承中父類中所有的成員(不管哪種權限)都會被繼承給子類,而不會丟失任何一個。
派生類和基類的構造析構關系
派生類并不繼承基類的構造和析構函數,只繼承成員變量和普通成員方法
派生類的構造函數一定會調用基類的構造函數,析構也一樣
#include <iostream>// 基類
class Animal {
public:// 帶參數的基類構造函數Animal(const std::string& name) : name_(name) {std::cout << "Animal constructor called for " << name_ << std::endl;}// 基類析構函數virtual ~Animal() {std::cout << "Animal destructor called for " << name_ << std::endl;}private:std::string name_;
};// 派生類
class Pigeon : public Animal {
public:// 帶參數的派生類構造函數Pigeon(const std::string& name, int age) : Animal(name), age_(age) {std::cout << "Pigeon constructor called for " << name << " aged " << age_ << std::endl;}// 派生類析構函數~Pigeon() {std::cout << "Pigeon destructor called for age " << age_ << std::endl;}private:int age_;
};int main() {Pigeon p("Polly", 3);return 0;
}
為什么派生類的構造(析構)必須調用基類的某個構造(析構)
(1)牢記構造函數的2大作用:初始化成員,分配動態內存
(2)派生類和基類各自有各自的構造函數和析構函數,所以是各自管理各自的成員初始化,各自分配和釋放各自所需的動態內存
(3)繼承的語言特性,允許派生類調用基類的構造和析構函數,以管理派生類從基類繼承而來的那些成員。
(4)明確:派生類的構造和析構處理的永遠是派生類自己的對象,只是派生類對象模板中有一部分是從基類繼承而來的而已。
總結:
理解繼承是什么
繼承時是全部繼承方法和屬性
方法和屬性的權限分三類private、public、protected
繼承時會導致方法和屬性的權限被改變
理解繼承的體系設計原理
理解派生類會怎么樣調用基類的構造、析構函數
學習記錄,侵權聯系刪除。
來源:朱老師物聯網大課堂