2013-05-02 37 views
0

我期待着持有對象的矢量,其中將是子類。我想我可以通過聲明一個向量指針到基類(如vector<BaseClass*> db),然後通過做一些類似db.pushback(new subclass)(我的例子在下面的鏈接是一個觸摸)聲明它爲子類不同的,但沿着相同的路線);C++向量的子類,使用它來超載istream/ostream

  • 是否有可能到多個子類存放在這個意義上我還是會需要定義每個子類一個新的載體?在給出的例子中,只有1個,但在我的程序中實際有四個。

  • 如果是這樣,在我的重載>>在SubClass1中,會動態地將類型轉換爲BaseClass的工作,以調用在BaseClass中友好的重載>>。

http://ideone.com/QM5sRY

編輯:

對不起,我不是我的問題的後半部分完全清楚。我應該擴大。

我有一個程序需要輸入,並將其分佈在各個類和子類中。它應該把輸入作爲Cin >> class;,在這種情況下,我已經超載了>>操作符。

但是,當我將數據定義爲子類(第34行到第39行,第44行)時,它似乎將其稱爲BaseClass而不是Subclass。然後,它會調用第10行中Base類中定義的朋友函數,而不是第21行。

我並不完全確定我要出錯的位置。

理想的情況下,輸出應爲

Printing:Data 
X = 1 
Y = 2 
+0

1)這是可能的,而且是多態的點 – 2013-05-02 15:10:55

+0

是的,你可以在此使用'的std :: VECTOR'方式。至於你的問題的其餘部分,你不完全清楚你想要完成什麼。 – Chad 2013-05-02 15:11:02

+0

對不起。我會嘗試清除它現在。將編輯成問題 – 2013-05-02 15:11:48

回答

0

你應該有一個虛擬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 
+0

感謝隊友。在閱讀虛擬函數時,我錯誤地解釋了它的用法,認爲虛擬函數的抽象定義複製到它的基類中。我並沒有意識到他們可以共存。 非常感謝您的幫助! – 2013-05-02 15:42:03