2012-07-18 65 views
2

我想創建一個對象數組,我想使用某個構造函數。帶派生類的push_back

std::vector<Modul> arrDigOut; 
arrDigOut.push_back(Modul(IDC_CHECK1, this, "GVL.DigOut1", pAddr)); 

只要DigOut不是派生類,此工作正常。當我得到它,並使用類DigOut失敗:

class Modul 
{ 
protected: 
    int   id; 
    int   nErr; 
    void*  plcVar; 
    bool  bDigOut; 
    PAmsAddr pAddr; 
    ULONG  lHdlVar; 
    CButton* pBt; 

public: 
    Modul(); 

    //Modul(int ID, Cbeckhoff_frontendDlg* pCbeckhoff,void* pVar,PAmsAddr pAdr) 
    //{ 
    // SetID(ID,pCbeckhoff); 
    // plcVar = pVar; 
    // pAddr = pAdr; 
    //}; 

    int   GetID() { return (id); }; 
    void*  GetplcVar() { return plcVar; }; 
    void  SetID(int ID, Cbeckhoff_frontendDlg* pCbeckhoff); 
    int   InitCheck(Cbeckhoff_frontendDlg* pCbeckhoff); 
    CButton* GetpBt(){return pBt;}; 
    void  SetButton(Cbeckhoff_frontendDlg* pCbeckhoff); 
}; 

class DigOut : protected Modul 
{ 
public: 
    DigOut(); 
    DigOut(int ID, Cbeckhoff_frontendDlg* pCbeckhoff,void* pVar,PAmsAddr pAdr) 
    { 
     SetID(ID,pCbeckhoff); 
     plcVar = pVar; 
     pAddr = pAdr; 
    }; 
}; 
+1

完全不相關的問題,但你不需要';'在函數定義之後。 – 2012-07-18 12:16:17

回答

9

這是因爲對象切片。你需要有一個指針或智能指針的載體基類:

std::vector<Modul*> arrDigOut; 
arrDigOut.push_back(new Modul(IDC_CHECK1, this,"GVL.DigOut1",pAddr)); 
arrDigOut.push_back(new DigOut()); 

記住,如果不使用智能指針以釋放內存。

當你有一個std::vector<Modul> arrDigOut;並插入一個派生類型的對象,它會被切成薄片,變成了Modul。該對象的Modul部分被複制到向量中,其餘部分將丟失。

+0

尋找「對象切片」使我進一步瞭解,但仍然是你的例子不能在我的代碼中工作,無論是新模塊還是新DigOut。 「這個」運算符有問題嗎? – womdom 2012-07-18 12:51:11

+0

@ user1534683是什麼? – 2012-07-18 12:53:02

+0

對不起,我第一次使用stackoverflow,不知道它在點擊時直接發送消息 womdom 2012-07-18 12:56:44