簡體   English   中英

子類的C ++ Vector,使用它來重載istream / ostream

[英]C++ Vector of Subclasses, using it to overload the istream/ostream

我正在尋找持有對象的向量,其中將是子類。

我以為可以通過向基類聲明一個指針向量(例如vector<BaseClass*> db ),然后通過執行類似db.pushback(new subclass)聲明它為子類的方式來做到這一點(我的示例在下面的鏈接中有所不同,但沿同一行);

  • 是否可以在這種意義上存儲多個子類?還是需要為每個子類定義一個新的Vector? 在給出的示例中,只有1,但是實際上在我的程序中有4。

  • 如果是這樣,在SubClass1中的重載>>中,將類型動態轉換為BaseClass是否可以在BaseClass中調用友好的重載>>?

http://ideone.com/QM5sRY

編輯:

抱歉,問題的后半部分我還不清楚。 我應該擴大。

我有一個需要輸入的程序,並將其分配到各個類和子類中。 輸入內容應為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM