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

C++/CLI 繼承與列舉類型深度解析

     編輯:關於C++

本文以銀行交易(存款/提款/轉帳)為領域模型,示範 C++/CLI 繼承體系、CLI 列舉型別、陣列繼承、覆寫與隱藏語意、存取修飾詞擴展。

CLI 列舉型別

public enum class TransactionType : unsigned char {
    Deposit, Withdrawal, Transfer
};

差異於原生 enum:

  • enum class 關鍵字標記 CLI 列舉(CLS 相容)。
  • 可指定基底型別(預設 int,此例 unsigned char)。
  • 列舉值作用域受型別限定:TransactionType::Deposit。
  • 無整數提升,強型別檢查。

隱含繼承 System::Enum,可用靜態方法反射:

Enum::GetName(type, value);      // 取得名稱
Enum::GetNames(type);            // 所有名稱陣列
Enum::GetUnderlyingType(typeid); // 底層型別

抽象基底類別

public ref class Transaction abstract {
    TransactionType type;
    DateTime dt;
protected:
    Transaction(TransactionType t) {
        Thread::Sleep(Random()->Next(1000,2001)); // 模擬延遲
        type = t; dt = DateTime::Now;
    }
public:
    property TransactionType Type { TransactionType get() { return type; } private: void set(TransactionType v) { type = v; } }
    property DateTime Time { DateTime get() { return dt; } private: void set(DateTime v) { dt = v; } }
    virtual void PostTransaction() abstract; // 純虛擬
};
  • abstract 修飾類別/方法(非關鍵字,上下文保留字)。
  • 屬性支援非對稱存取性(public get / private set)。
  • 建構函式 protected 僅供衍生類別呼叫。

具體交易類別

public ref class Deposit sealed : Transaction {
    Decimal amount; int toAcct;
public:
    Deposit(double a, int acct) : Transaction(TransactionType::Deposit) { amount = (Decimal)a; toAcct = acct; }
    Deposit(Decimal a, int acct) : Transaction(TransactionType::Deposit) { amount = a; toAcct = acct; }
    property Decimal Amount { Decimal get() { return amount; } private: void set(Decimal v) { amount = v; } }
    property int ToAccount { int get() { return toAcct; } private: void set(int v) { toAcct = v; } }
    void PostTransaction() { Console::WriteLine("{0} -- {1}", Time, this); }
    virtual String^ ToString() override { return String::Format(" Dep: {0,10:0.00} {1,10}", Amount, ToAccount); }
};
  • sealed 禁止進一步繼承(設計意圖明確)。
  • Decimal 適合金融計算。
  • 多建構函式便利性(double/Decimal)。
  • 格式化字串 {0,10:0.00}:寬度 10、右對齊、兩位小數。

測試多型

array<Transaction^>^ list = gcnew array<Transaction^> {
    gcnew Deposit(123.05, 12345),
    gcnew Transfer(Decimal::Parse("1256.40"), 1111, 222),
    gcnew Withdrawal(34.54, 232323),
    gcnew Deposit(56.12, 14321)
};
for each (Transaction^ t in list) t->PostTransaction();

輸出顯示各交易時間與格式化明細,驗證虛擬函數動態派發。

陣列繼承

所有 CLI 陣列隱含繼承 System::Array,擁有 Length、Sort、BinarySearch、Copy、Clear 等靜態/實例方法:

array<int>^ a = gcnew array<int>{10,75,23,18,53,18};
Array::Sort(a); Array::Reverse(a); Array::Copy(a, b, 4);

覆寫 vs 隱藏

範例中 B::F2 new virtual 隱藏 A::F2,透過 A^ 呼叫仍解析至 A::F2;C::F2x = B::F2 命名覆寫恢復動態派發。

擴展存取修飾詞

標準 C++ 三種(public/protected/private)外,C++/CLI 增加組件層級可見性:

  • internal:僅限同組件。
  • public protected:同組件 + 衍生類別(跨組件)。
  • private protected:同組件 + 衍生類別(僅同組件內定義)。

成員可見性受限於類別可見性(public/private)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
修飾詞行為動態派發
virtual ... override覆寫基底虛擬函式是
virtual ... new隱藏基底虛擬函式,新虛擬槽位否(靜態型別決定)
new(非虛擬)隱藏基底非虛擬函式否