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

再談「在 STL 列表中插入不同類型的物件」

     編輯:關於VC++

問題回顧

原文嘗試在 vector<synObject*> 存放基類指標,指向衍生類別 (synPin, synCell) 物件,遍歷時欲呼叫衍生類別專屬方法。

錯誤原因分析

指標轉型時未正確指定原型,導致無法找到正確的虛擬函數表項目,造成呼叫錯誤。關鍵在於:

  1. 基類需宣告 virtual 解構函數與虛擬函數。
  2. 使用 dynamic_cast 或 static_cast 正確轉型。
  3. 迭代器解參考後為基類指標,需轉為衍生類別指標再呼叫專屬方法。

修正程式碼 (Dev-C++ g++ 通過)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

class synObject {
public:
    synObject() { className = "synObject"; }
    virtual ~synObject() {}
    virtual string GetClass() { return className; }
    string className;
};

class synPin : public synObject {
    string pin;
public:
    synPin() { className = "synPin"; }
    void SetPin(string p) { pin = p; }
    string GetPin() { return pin; }
};

class synCell : public synObject {
    string cell;
public:
    synCell() { className = "synCell"; }
    void SetCell(string c) { cell = c; }
    string GetCell() { return cell; }
};

int main() {
    vector<synObject*> vec;
    vec.push_back(new synObject);
    synPin* pPin = new synPin; pPin->SetPin("myPin"); vec.push_back(pPin);
    synCell* pCell = new synCell; pCell->SetCell("myCell"); vec.push_back(pCell);

    for (auto it = vec.begin(); it != vec.end(); ++it) {
        cout << (*it)->GetClass() << endl;
        if ((*it)->GetClass() == "synCell") {
            cout << dynamic_cast<synCell*>(*it)->GetCell() << endl;
        }
        if ((*it)->GetClass() == "synPin") {
            cout << dynamic_cast<synPin*>(*it)->GetPin() << endl;
        }
    }
    // 記得 delete 釋放記憶體
    return 0;
}

重點提醒

  • 基類必須有虛擬解構函數,確保正確解構衍生物件。
  • 使用 dynamic_cast 安全轉型(需 RTTI),或 static_cast 配合型別檢查。
  • 避免直接對迭代器做多層指標運算(如 **(synCell**)it),極易出錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved