簡體   English   中英

C ++如何使用派生對象中的獨立基礎對象

[英]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.

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