[英]C++ How to use stand-alone base object from derived object
我有3節課。 一個是基礎,一個是父母,一個是孩子。 在某些時候實例化父對象並分配數據。 在某些情況下,可以直接使用它,但在其他情況下,則需要在其子類中實現的功能。
我想做的是將父對象轉換為子對象,以便將其虛擬函數與父對象的數據一起使用:
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數據),盡管我發誓它應該是未定義的行為(我知道也可以起作用)。 因為我懷疑這是正確的做法,所以我想問一下這是否可以,或者除構圖之外還有其他方法。
UndoBase *command = static_cast<CommandChild*>(parent);
這條線的每一寸都是地獄。 您正在告訴static_cast強制轉換為CommandChild,而您將其存儲在UndoBase中。
另外,您還嘗試將CommandParent強制轉換為CommandChild,這意味着Base到Derived,而Base類不知道派生強制轉換。 即使您正確編寫它。
CommandChild *child = static_cast<CommandChild*>(parent);
除此以外,在這些情況下請始終使用dynamic_cast。 它顯式檢查是否可以進行強制類型轉換。如果強制類型轉換是安全的,則dynamic_cast將正確地進行強制類型轉換;如果無法將其強制類型轉換為目標類型,則返回NULL(對於指針而言,對於引用它會拋出bad_cast異常)。
您必須使用復制構造函數使用CommandParent中的數據創建CommandChild的新實例。
UndoBase *command = new CommandChild(*parent);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.