深入理解 C++ 中的多型與檔案操作

小万哥丶發表於2024-04-29

C++ 多型

多型(Polymorphism)是物件導向程式設計(OOP)的核心概念之一,它允許物件在相同操作下表現出不同的行為。在 C++ 中,多型通常透過繼承和虛擬函式來實現。

理解多型

想象一個場景,你有一個動物園,裡面有各種動物,如貓、狗、鳥等。每個動物都有自己的叫聲。使用物件導向程式設計,我們可以建立一個基類 Animal 來表示所有動物,併為其定義一個 makeSound() 虛擬函式。然後,我們可以建立派生類,如 CatDogBird,並重寫它們的 makeSound() 方法以實現各自的叫聲。

class Animal {
public:
  virtual void makeSound() = 0; // 虛擬函式宣告
};

class Cat : public Animal {
public:
  void makeSound() override {
    cout << "Meow!" << endl;
  }
};

class Dog : public Animal {
public:
  void makeSound() override {
    cout << "Woof!" << endl;
  }
};

class Bird : public Animal {
public:
  void makeSound() override {
    cout << "Chirp!" << endl;
  }
};

在這個例子中,Animal 類的 makeSound() 函式被宣告為虛擬函式,這意味著它可以在派生類中被重寫。當我們建立一個 Animal 型別的指標或引用時,我們可以指向任何派生類的物件。然後,呼叫 makeSound() 函式時,實際執行的程式碼將取決於指向的物件的型別。

多型的優點

  • 程式碼的可重用性: 多型允許您為通用的基類操作建立通用函式,並在派生類中進行具體實現。
  • 靈活性: 多型使您的程式碼更加靈活,因為它允許您在執行時根據實際情況選擇不同的行為。
  • 可維護性: 多型可以提高程式碼的可維護性,因為它使程式碼更易於理解和修改。

多型的實現

在 C++ 中,多型的實現主要依靠以下兩個機制:

  • 繼承: 如上所述,多型通常透過繼承來實現。基類定義虛擬函式,派生類可以重寫這些函式以實現特定的行為。
  • 虛擬函式: 虛擬函式是帶有 virtual 關鍵字的成員函式。當呼叫虛擬函式時,實際執行的程式碼將取決於指向的物件的型別。

總結

多型是物件導向程式設計中一個強大的工具,它允許您建立更靈活、更可維護的程式碼。透過理解多型的基本概念及其實現機制,您可以提高自己的程式設計技能並構建更加優雅的軟體解決方案。

C++ 檔案操作

C++ 提供了多種機制來操作檔案,包括建立、讀取、寫入和修改檔案。常用的檔案操作庫包括 fstream<filesystem>

1. 使用 fstream

fstream 庫是 C++ 中最常用的檔案操作庫之一。它提供了以下類:

  • ofstream: 用於建立和寫入檔案
  • ifstream: 用於讀取檔案
  • fstream: 同時支援讀寫操作

示例:建立並寫入檔案

#include <iostream>
#include <fstream>

using namespace std;

int main() {
  // 建立 ofstream 物件並開啟檔案
  ofstream myFile("myfile.txt");

  // 檢查檔案是否開啟成功
  if (myFile.is_open()) {
    // 將文字寫入檔案
    myFile << "This is a line of text in my file." << endl;

    // 關閉檔案
    myFile.close();
    cout << "File written successfully." << endl;
  } else {
    cout << "Error opening file." << endl;
  }

  return 0;
}

示例:讀取檔案

#include <iostream>
#include <fstream>

using namespace std;

int main() {
  // 建立 ifstream 物件並開啟檔案
  ifstream myFile("myfile.txt");

  // 檢查檔案是否開啟成功
  if (myFile.is_open()) {
    string line;

    // 逐行讀取檔案內容
    while (getline(myFile, line)) {
      cout << line << endl;
    }

    // 關閉檔案
    myFile.close();
  } else {
    cout << "Error opening file." << endl;
  }

  return 0;
}

2. 使用 <filesystem>

C++17 引入了 <filesystem> 庫,提供了更現代的檔案操作介面。

示例:建立並寫入檔案

#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = std::filesystem;

int main() {
  // 建立檔案路徑
  fs::path myFile("myfile.txt");

  // 開啟檔案並寫入文字
  fs::ofstream ofs(myFile);
  if (ofs.is_open()) {
    ofs << "This is a line of text in my file." << endl;
    ofs.close();
  } else {
    cout << "Error opening file." << endl;
  }

  return 0;
}

示例:讀取檔案

#include <iostream>
#include <filesystem>

using namespace std;
namespace fs = std::filesystem;

int main() {
  // 建立檔案路徑
  fs::path myFile("myfile.txt");

  // 開啟檔案並讀取內容
  fs::ifstream ifs(myFile);
  if (ifs.is_open()) {
    string line;
    while (getline(ifs, line)) {
      cout << line << endl;
    }
    ifs.close();
  } else {
    cout << "Error opening file." << endl;
  }

  return 0;
}

總結

C++ 提供了多種檔案操作機制,可用於建立、讀取、寫入和修改檔案。fstream 庫是傳統選擇,而 <filesystem> 庫提供了更現代的介面。選擇哪個庫取決於您的專案需求和個人喜好。

請注意,以上只是一些簡單的示例。C++ 檔案操作還涉及許多其他高階功能,例如目錄操作、錯誤處理和檔案迭代。建議您查閱 C++ 標準庫文件和相關教程以瞭解更多資訊。

最後

為了方便其他裝置和平臺的小夥伴觀看往期文章:

微信公眾號搜尋:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關注

相關文章