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

C++ Primer 學習筆記 70:面向對象編程——純虛函數、容器與繼承

     編輯:C++ 入門

引言

本節作為 C++ Primer 面向對象編程部分的進階筆記,重點探討純虛函數機制、標準庫容器與繼承體系的交互使用。由於原始輸入內容極少,以下內容結合 C++ Primer 第 15 章與第 16 章核心知識點整理而成,旨在補全知識體系。

純虛函數與抽象基類

語法與語義

class Shape {
public:
    virtual double area() const = 0; // 純虛函數
    virtual ~Shape() = default;      // 虛析構函數必不可少
};
  • = 0 標記純虛函數,含有純虛函數的類為抽象基類,不能實例化對象
  • 派生類必須覆蓋所有純虛函數,否則仍為抽象類
  • 純虛函數可以有定義(如析構函數常提供定義供派生類調用)

典型應用:介面契約

class Drawable {
public:
    virtual void draw() const = 0;
    virtual void move(Point p) = 0;
    virtual ~Drawable() = default;
};

class Circle : public Drawable { /* 實現 draw/move */ };
class Rectangle : public Drawable { /* 實現 draw/move */ };

純虛函數定義了「介面契約」,強制派生類實現特定行為,實現運行時多態。

容器存儲繼承體系對象

對象切片問題

std::vector shapes; // 錯誤:存基類對象會切片
shapes.push_back(Circle(1.0)); // 只保留 Shape 部分

解決方案:存儲智能指針

std::vector> shapes;
shapes.push_back(std::make_unique(1.0));
shapes.push_back(std::make_unique(2,3));

for (const auto& s : shapes) 
    std::cout << s->area() << '\n'; // 正確多態調用
  • unique_ptr 獨占所有權,避免內存洩漏
  • 若需共享所有權,用 shared_ptr
  • 容器元素為指針/智能指針時,析構函數必須虛化

容器操作與多態

class Base {
public:
    virtual void foo() { /* ... */ }
    virtual void bar() final { /* ... */ } // 禁止進一步覆蓋
};

class Derived : public Base {
public:
    void foo() override { /* ... */ } // override 關鍵字檢查簽名
    // void bar() override { } // 編譯錯誤:final 禁止覆蓋
};

3. 基類析構函數務必虛化

否則 delete base_ptr 僅調用基類析構,導致資源洩漏。

4. 避免在構造/析構函數中調用虛函數

此時虛表指針尚未完全設置/已重置,會調用基類版本而非派生類版本。

標準庫容器與繼承的進階技巧

異構容器與 type-erasure

若需存儲無公共基類的類型,可用 std::any (C++17) 或 std::variant (C++17),或實現類似 std::function 的類型擦除包裝器。

容器的拷貝與移動語義

std::vector> v1;
v1.push_back(std::make_unique(1));
auto v2 = std::move(v1); // 高效轉移所有權,v1 變空
// v1 = v2; // 編譯錯誤:unique_ptr 不可拷貝

總結

純虛函數構建抽象介面,智能指針容器實現多態存儲,override/final 強化編譯期檢查,虛析構保證資源正確釋放——這四大支柱構成了現代 C++ 面向對象設計的核心。實際項目中,優先考慮基於值的設計(如 variant、CRTP),僅在真正需要運行時多態時引入繼承體系。

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