2014-11-04 44 views
0

我有3個類。一個是基地,一個是父母,一個是小孩。父母在某個時間點實例化並分配數據。在某些情況下,它直接使用,但在其他情況下,需要在其子類中實現功能。C++如何使用派生對象中的獨立基礎對象

我想什麼做的是對父對象澆鑄成子對象,因此它的虛函數將與母公司的數據可用於:

class UndoBase : public QUndoCommand 
{ 
public: 
    UndoBase() {}  

    virtual void undo() = 0; 
    virtual void redo() = 0; 
}; 

class CommandParent : public UndoBase 
{ 
public: 
    CommandParent() {} 

    virtual void undo() 
    virtual void redo() 

protected: 
    someType data 
}; 

class CommandChild : public CommandParent 
{ 
public: 
    CommandChild() {} 

    virtual void undo() //overrides parent 
    virtual void redo() //overrides parent 
}; 

我已經試過這樣:

CommandParent *parent = new CommandParent; 
//assign data 
UndoBase *command = static_cast<CommandChild*>(parent); 
command->redo(); 

而且它工作(使用CommandChild實現和CommandParent數據),雖然我會發誓它應該是未定義的行爲(這也可以工作,我知道)。既然我懷疑這是正確的做法,我想問問這是否確定,或者除了組合之外還有其他方法。

+0

如果您將對象創建爲父對象,則永遠不會成爲/轉換爲子對象。你必須立即將它作爲一個孩子,把它當作父母來對待,有時把它當作一個孩子來對待。 – 2014-11-04 11:26:30

+1

'ommandParent * parent = new CommandParent;',此行錯誤後''CommandChild'的任何考慮* *。沒有這樣的物體存在,你不會通過揮動魔杖來神奇地創造出這樣的物體。 – WhozCraig 2014-11-04 11:32:20

+0

是的,我明白了。任何將基礎對象「注入」孩子作爲基礎的方法? – Resurrection 2014-11-04 11:37:33

回答

-1

您必須使用複製構造函數從CommandParent創建CommandChild的新實例。

UndoBase *command = new CommandChild(*parent); 
1
UndoBase *command = static_cast<CommandChild*>(parent); 

這是所有的地獄,在這條線的每寸。您正在告訴static_cast投射到CommandChild,而您將其存儲在UndoBase中。

此外,您正試圖將CommandParent轉換爲CommandChild,意味着要派生Base,其中Base類不知道派生轉換。即使你寫得很好。

CommandChild *child = static_cast<CommandChild*>(parent); 

這將是錯誤的。除此之外總是使用dynamic_cast這些情況。它會明確檢查cast是否可能。如果cast是安全的,那麼.dynamic_cast將正確轉換;如果不能轉換爲目標類型,則返回NULL(如果是指針,則爲引用拋出bad_cast異常)。

相關問題