1. 程式人生 > >個人對繼承理解以及虛解構函式的理解

個人對繼承理解以及虛解構函式的理解

       今天又從新研究了下繼承和過載,感覺又有新的體會。

        首先是對繼承的理解,繼承簡單的說就是把基類的東西保留下來(一般都是public繼承,這樣基類中的public成員繼承過來後還是public,基類中的protected成員繼承過來後為protected,private成員派生類也無法訪問)。這樣就達到了程式碼複用的效果,派生類繼承了基類的各個成員及方法。對於派生類來說,如果需要新的成員或者方法,可以在類中新增新的成員和方法,但要注意新新增的成員要進行初始化。

         對於一個繼承類定義物件。首先是先自動呼叫的是基類的預設建構函式(如果在派生類中手動呼叫基類的建構函式如:C::C(int a, int b):B(a), m1(b) ,則不去呼叫預設的建構函式而是其他建構函式在這裡是B(a)),接著系統會呼叫派生類的建構函式,這樣就產生了繼承類的物件。

         對於程式來說,程式結束的時候析構很重要,如果析構無法正常完成,將造成大量的資源浪費。然而對於繼承來說,析構又是一個什麼樣的過程呢?通過實驗,我發現,派生類物件的析構首先呼叫派生類解構函式,接著呼叫基類解構函式。

         我是這樣理解的。

         對於呼叫解構函式先後問題:程式的執行是將每句指令調入記憶體中,以壓棧的方式存入棧中,對於先宣告的成員必定後析構,即先入後出,比如定義了兩個變數human man; student stu; 那麼系統先析構stu後析構man。同理對於派生類的物件,先呼叫了基類的構造後呼叫了繼承類的構造,所以在析構的時候先“彈出”繼承類的析構,後“彈出”基類的析構。

         除此之外,我們學習繼承的時候總是要設定基類的解構函式為虛擬函式,這是為什麼呢?對於虛擬函式來說具有動態鏈編的能力,當一個基類指標指向派生類的物件時,析構該物件,如果沒有虛擬函式,則不會執行派生類的解構函式,而是執行基類的解構函式,另外當函式覆蓋時沒有定義成虛擬函式,則不會對呼叫派生類對應的函式。也就是說,當解構函式不是虛擬函式時,此類物件的析構無法掉要派生類的析構,則會出現記憶體洩露的現象。

另外多說一句:虛具有傳遞性

相關推薦

個人繼承理解以及函式理解

       今天又從新研究了下繼承和過載,感覺又有新的體會。         首先是對繼承的理解,繼承簡單的說就是把基類的東西保留下來(一般都是public繼承,這樣基類中的public成員繼承過來後還是public,基類中的protected成員繼承過來後為protec

C++之繼承(多重繼承+多繼承+繼承+函式+重定義)

多重繼承和多繼承 這個我們來講講這兩個的概念問題,一字之差,千差萬別。 多重繼承,比如有三個類,人類-士兵類-步兵類,三個依次繼承,這樣的繼承稱為多重繼承。 class Person {}; class Soldier :public Person

[收集]c++抽象類、純虛擬函式以及巧用純函式實現介面類

在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要在基類宣告某函式的情況,而不需要寫具體的實現,那C++中是如何實現這一功能的,答案是純虛擬函式。 含有純虛擬函式的類是抽象類,不能生成物件,只能派生。

C++學習:虛擬函式,純虛擬函式(virtual),繼承,函式

C++學習:虛擬函式,虛繼承,純虛擬函式(virtual)虛解構函式 虛擬函式 純虛擬函式 虛解構函式 虛繼承 簡介 在java這種高階語言中,有abstract和interface這兩個關鍵字.代表的是抽象類和介面,但是在C++這門語言中

C++繼承、多型,成員函式(包括函式複製建構函式)學習筆記

通過哺乳類派生貓、狗等學習繼承、多型中的知識點 先貼上類的程式碼 #include<iostream> enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERAMN, LAB };//犬種 class Mam

C++中基類的函式為什麼要用virtual函式【轉】

(轉自:https://blog.csdn.net/iicy266/article/details/11906457) 知識背景          要弄明白這個問題,首先要了解下C++中的動態繫結。&n

C++ 函式函式的區別

先看下面程式碼: class Parent { public: Parent(); ~Parent(); }; Parent::Parent() { cout << "基類構造...." << endl << endl; } Parent::

函式與純虛擬函式

虛解構函式 通過基類的指標刪除派生類物件時,通常情況只調用基類的解構函式 但是,刪除一個派生類物件時,應該先呼叫派生類的解構函式,然後呼叫基類的解構函式(構造時自頂向下,析構時自底向上) 這種情況會產生記憶體洩漏,最終導致系統應可用記憶體不足而崩潰 解決辦法 把基類的解構函式宣告為virtual,此

函式(派生類與基類)

1.情況1, class Base { public: ~Base() { cout << "~Base()" << endl; } }; class Derived1 : public Base { public: Derived1():name_

函式和純函式的作用

1 虛解構函式 作用: 當使用基類的指標刪除一個派生類的物件時,可以呼叫派生類的解構函式。由於有虛擬函式表的存在,這裡就發生了多型,使得派生類的解構函式能夠被呼叫。反之,如果基類的解構函式不是虛擬函式,則使用基類的指標刪除派生類的物件時,不會呼叫派生類的解構函式

C++中基類的函式為什麼要用virtual函式

知識背景          要弄明白這個問題,首先要了解下C++中的動態繫結。  正題          直接的講,C++中基類採用virtual虛解構函式是為了防止記憶體洩漏。具體地說,如果派生類中申請了記憶體空間,並在其解構函式中對這些記憶體空間進行釋放

函式、虛擬函式考題

虛解構函式、虛擬函式結合考題變種 1.[Effective C++原則07]:為多型基類宣告virtual 解構函式。 [如果不]: 如果不宣告為解構函式,可能出現的結果如下:Derived物件的成分沒有被銷燬,形成資源洩露、在除錯上會浪費很長時間。 #incl

057函式

上一篇中的動態多型可在某些情況下發生記憶體洩漏,通過虛解構函式避免。 Coordinate.h #ifndef COORDINATE_H #define COORDINATE_H class Coordinate { public: Coordinate(int x, int

為什麼要用函式

我們知道,用C++開發的時候,用來做基類的類的解構函式一般都是虛擬函式。可是,為什麼要這樣做呢?下面用一個小例子來說明:    有下面的兩個類: class ClxBase { public:     

C++進階--派生類的析(函式,shared_ptr)

//############################################################################ /* 在多型虛基類中宣告一個虛解構函式 */ /* 為什麼需要虛解構函式 */ class yellowdog : public dog { };

[CareerCup] 13.6 Virtual Destructor 函式

13.6 Why does a destructor in base class need to be declared virtual? 這道題問我們為啥基類中的解構函式要定義為虛擬函式。首先來看下面這段程式碼: class Foo { public: void f(); };

c++虛擬函式表與函式

由於本人才疏學淺,本文難免存在遺漏之處,歡迎大家留言指正,本人將感激不盡。 C++虛擬函式表與虛解構函式 1.靜態聯編和動態聯編 聯編:將原始碼中的函式呼叫解釋為要執行函式程式碼。 靜態聯編:編譯時能確定唯一函式。 在C中,每個函式名都能確定唯一的函式程式碼。

從零開始學C++之虛擬函式與多型(一):虛擬函式表指標、函式、object slicing與虛擬函式、C++物件模型圖

#include <iostream>using namespace std;class CObject {public:     virtual void Serialize()     {         cout << "CObject::Serialize ..." <&

C++ 第六章(多型性和虛擬函式)下篇(函式和純虛擬函式

一,虛解構函式 如果用new運算子建立了臨時物件,若基類中有解構函式並且定義了一個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生:系統只執行基類的解構函式,而不執行派生類的解構函式。 #include<iostream> using

C++學習之多型篇(虛擬函式函式的實現原理--虛擬函式表)

通過下面的程式碼來說明: #include <iostream> #include <stdlib.h> #include <string> using namespace std; /**  *  定義動物類:Animal  *  成員