C++虛函數與純虛函數的區別

一、虛函數的基本概念

虛函數是C++中用於實現多態的機制之一,它能夠讓我們在基類中定義函數,而在派生類中進行重寫,讓程序在運行時根據對象所屬的實際類型來調用相應的函數。

C++的虛函數的應用場景主要在於,我們定義一個基類,然後在派生類中重寫相應的虛函數,可以使得程序能夠更加靈活,根據具體的需求來調用不同的函數。比如,在一個動物類中定義虛函數eat()和sleep(),然後在派生類中定義不同類型的動物比如狗類和貓類,並分別實現eat()和sleep()函數,就可以根據實際需要來使用這些函數了。

虛函數的定義:在基類中的虛函數,可以在其後面添加關鍵字virtual,表示這是一個虛函數。

    class Animal {
    public:
        virtual void eat();
        virtual void sleep();
    };

二、純虛函數的定義

純虛函數是一種沒有實現的虛函數。在基類中定義一個純虛函數,其語法與虛函數基本相同,但是在函數的後面加上了=0。

定義純虛函數的主要目的是為了讓派生類必須實現這個函數,為了達到這個目的,我們不能在聲明的時候直接將純虛函數賦值為0,只能在具體的派生類中實現這個函數。如果某個派生類沒有實現這個純虛函數,那麼該派生類也會變成抽象類,無法實例化。

純虛函數的定義:

    class Animal {
    public:
        virtual void eat() = 0;
        virtual void sleep() = 0;
    };

三、虛函數與純虛函數的區別

1. 虛函數與純虛函數的定義方式不同

虛函數的定義在函數的聲明中添加virtual關鍵字即可,而定義一個純虛函數在函數聲明後面加上=0

    // 定義虛函數
    virtual void eat();
    
    // 定義純虛函數
    virtual void eat() = 0;

2. 純虛函數是抽象類的標記

對於含有純虛函數的類,稱為抽象類。在抽象類中,由於沒有實現純虛函數,所以無法創建該抽象類的實例。

虛函數不需要被實現,可以被覆蓋或不被覆蓋。

    class Animal {
    public:
        virtual void eat() = 0; // 純虛函數
        virtual void sleep(); // 虛函數
    };

3. 實現方式不同

派生類中對於純虛函數和虛函數的實現方式都是不一樣的。純虛函數必須在派生類中被實現,而虛函數可選擇是否實現。否則,當該虛函數被調用時,將會執行基類的版本。

    class Dog : public Animal {
    public:
        virtual void eat() {
            // 狗類的具體實現
        }
        virtual void sleep() {
            // 狗類的具體實現
        }
    };

4. 區別體現在內存布局上

虛函數會為每個包含虛函數的對象添加一個虛函數表指針,指向一個全局的虛函數表(Virtual Table),維護虛函數指針及其所指向的函數的關係。

而對於純虛函數來說,虛函數表中沒有其對應的函數地址,只是一個空指針,這也是純虛函數無法被直接調用的原因。

四、總結

在實際應用中,虛函數和純虛函數都有各自的優劣。虛函數能夠提供默認實現,不完全由派生類重寫,而純虛函數則能夠確保派生類實現了該函數,讓程序更加穩定。我們應該根據具體需求來選擇使用哪種方式。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/191172.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:09
下一篇 2024-11-30 09:09

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29

發表回復

登錄後才能評論