首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 純虛函數與抽象基類深度解析

     編輯:關於C++

前言

在 C++ 物件導向設計中,純虛函數與抽象基類是實現介面導向程式設計、達成多型與解耦的核心機制。本文將詳細說明其語法、語意、限制與實務應用。

一、什麼是純虛函數

純虛函數是在基類中宣告但不提供定義(實作)的虛函數,語法為在函數宣告尾端加上 = 0。

class Shape {
public:
    virtual void draw() = 0;  // 純虛函數
    virtual ~Shape() = default; // 虛擬解構子
};

關鍵特性:

  • 僅宣告,不定義函數主體
  • 強制衍生類別必須覆寫(除非衍生類別也是抽象類別)
  • 可選擇性提供定義(較少見,供衍生類別呼叫)

二、抽象基類

包含至少一個純虛函數的類別即為抽象基類。其特性:

  • 無法實例化物件(Shape s; 編譯錯誤)
  • 僅能作為基類被繼承
  • 可定義指標/參考指向衍生類別物件,實現多型

三、虛函數與純虛函數的差異

特性虛函數純虛函數
語法virtual void f();virtual void f() = 0;
定義必須提供(即使不使用)可不提供
衍生類別可選擇性覆寫必須覆寫(否則仍為抽象類別)
實例化基類可實例化基類不可實例化

四、程式碼範例

/* CppPrimer.cpp
 * Created on: 2013.11.12
 * Author: Caroline
 * Compiler: eclipse cdt
 */
#include <iostream>
#include <string>
using namespace std;

// 抽象基類
class Animal {
public:
    virtual void speak() = 0;  // 純虛函數
    virtual ~Animal() = default;
};

// 具體衍生類別
class Dog : public Animal {
public:
    void speak() override { cout << "汪汪!" << endl; }
};

class Cat : public Animal {
public:
    void speak() override { cout << "喵~" << endl; }
};

void makeSound(Animal& a) {
    a.speak();  // 多型呼叫
}

int main() {
    Dog dog;
    Cat cat;
    makeSound(dog);  // 輸出:汪汪!
    makeSound(cat);  // 輸出:喵~
    // Animal a;     // 編譯錯誤:抽象類別無法實例化
    return 0;
}

五、進階主題

1. 純虛函數提供定義

雖然罕見,但純虛函數可以有定義,通常用於基類預設行為供衍生類別呼叫:

class Base {
    virtual void init() = 0;
};
void Base::init() {  // 提供定義
    cout << "Base initialization" << endl;
}
class Derived : public Base {
    void init() override { Base::init(); cout << "Derived init" << endl; }
};

2. 純虛解構子

基類解構子應宣告為虛擬,若為純虛則必須提供定義:

class Base {
    virtual ~Base() = 0;  // 純虛解構子
};
Base::~Base() {}  // 必須提供定義

六、設計準則

  • 介面類別應只包含純虛函數與虛擬解構子
  • 避免在建構子/解構子中呼叫虛函數(靜態繫結)
  • 使用 override (C++11) 明確表達覆寫意圖
  • 優先使用組合而非繼承,必要時才使用抽象基類

七、總結

純虛函數定義了「契約」,抽象基類提供了「介面」。兩者結合讓 C++ 支援介面導向設計,實現執行期多型,是建構可擴充、低耦合系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved