原文嘗試在 vector<synObject*> 存放基類指標,指向衍生類別 (synPin, synCell) 物件,遍歷時欲呼叫衍生類別專屬方法。
指標轉型時未正確指定原型,導致無法找到正確的虛擬函數表項目,造成呼叫錯誤。關鍵在於:
virtual 解構函數與虛擬函數。dynamic_cast 或 static_cast 正確轉型。#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),極易出錯。