[英]C++ Vector of Subclasses, using it to overload the istream/ostream
我正在尋找持有對象的向量,其中將是子類。
我以為可以通過向基類聲明一個指針向量(例如vector<BaseClass*> db
),然后通過執行類似db.pushback(new subclass)
聲明它為子類的方式來做到這一點(我的示例在下面的鏈接中有所不同,但沿同一行);
是否可以在這種意義上存儲多個子類?還是需要為每個子類定義一個新的Vector? 在給出的示例中,只有1,但是實際上在我的程序中有4。
如果是這樣,在SubClass1中的重載>>中,將類型動態轉換為BaseClass是否可以在BaseClass中調用友好的重載>>?
編輯:
抱歉,問題的后半部分我還不清楚。 我應該擴大。
我有一個需要輸入的程序,並將其分配到各個類和子類中。 輸入內容應為Cin >> class;
,在這種情況下,我要重載>>運算符。
但是,當我將數據定義為Subclass時(第34至39行以及第44行),它似乎將其稱為BaseClass,而不是Subclass。 然后,它在第10行而不是第21行調用在基類中定義的friend函數。
我不確定自己要去哪里。
理想情況下,輸出應為
Printing:Data
X = 1
Y = 2
您應該有一個虛擬的fromSerial函數,該函數讀取每個類的必要數據。 這是一個示例http://ideone.com/WGwj8l 。 還要注意虛擬關鍵字的用戶。 您需要它來實現多態。 還要注意虛擬析構函數。
#include <iostream>
#include <vector>
using namespace std;
class BaseClass{
public:
int x;
public:
BaseClass(){x = 0;}
virtual istream& fromSerial(istream& stream){ return stream >> x; }
virtual void print(){
cout << "BaseClass::x = " << x << endl;
}
virtual ~BaseClass(){}
};
class SubClass1: public BaseClass{
public:
int y;
public:
SubClass1(){y = 0;}
virtual istream& fromSerial(istream& stream){
BaseClass::fromSerial(stream); //read baseclass first
return stream >> y;
}
virtual void print(){
BaseClass::print();
cout << "SubClass1::y = " << y << endl;
}
};
BaseClass* createNewClass(BaseClass * temp)
{
cout << "Input 2 values: ";
temp->fromSerial(cin);
return temp;
}
int main()
{
vector<BaseClass*> db;
db.push_back(createNewClass(new SubClass1));
cout << "\nPrinting Data: " << endl;
db[0]->print();
}
輸入: 1 2
輸出:
Input 2 values:
Printing Data:
BaseClass::x = 1
SubClass1::y = 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.