調用非虛函數在派生類中作爲this answer指出:使用基類指針
上dynamic_cast的高度依賴往往是指示你的設計出了問題。
我想知道的是我怎麼能調用自定義函數在派生類中,針對其存在的基類中沒有同名的功能,但這樣做使用基類指針,也許如果實際上沒有dynamic_cast
有更好的方法。
如果這個函數是一個在兩個函數中定義的虛函數,那很簡單。但是這只是派生類中的一個獨特功能。
也許dynamic_cast
是最好的方式?
調用非虛函數在派生類中作爲this answer指出:使用基類指針
上dynamic_cast的高度依賴往往是指示你的設計出了問題。
我想知道的是我怎麼能調用自定義函數在派生類中,針對其存在的基類中沒有同名的功能,但這樣做使用基類指針,也許如果實際上沒有dynamic_cast
有更好的方法。
如果這個函數是一個在兩個函數中定義的虛函數,那很簡單。但是這只是派生類中的一個獨特功能。
也許dynamic_cast
是最好的方式?
爲了調用Derived
類的函數,您必須獲取指向派生類的指針。作爲(視情況)的選項,您可能希望使用static_cast
,而不是dynamic
,但正如你所說的:
it is often an indication your design has gone wrong
此外,有時我覺得使用蒙上它的確定。當我爲遊戲設計GUI庫時,它有一個基類Widget
和許多子類。一個實際的窗口布局是在一個編輯器中完成的,稍後一些Loader
類正在膨脹這種佈局。爲了從佈局中填充小部件以及每個小部件數據的實際特定(遊戲相關),我製作了一個用於從小部件查詢小部件的子項的方法。此函數將其重新調整爲Widget*
,然後將其dynamic_casted
調整爲實際類型。我還沒有找到更好的設計。
後來我還發現Android
是GUI系統的工作方式相同
有趣,謝謝。我已經添加了一個新的問題,更詳細地介紹了我需要實現的內容。 http://stackoverflow.com/questions/16577697/struggling-with-design-decision-regarding-polymorphic-member – johnbakers
我想知道的是我怎麼能叫在派生類中...自定義函數沒有
dynamic_cast
如果事實有更好的辦法
正如引用中指出的那樣,這是一個設計問題,而不是實現問題。調用該函數沒有「更好的方法」; 「更好的方法」是重新設計你的類型,以便子類型不需要向父母添加功能。通過這樣做,你的類型可以滿足Liskov替換原則的一個共同解釋,並且更容易使用,因爲用戶根本不需要知道子類型。
如果以這種方式重新設計類型是不可能或不合理的,那麼也許您確實需要RTTI。建議並沒有說「所有用途......」,只是「高度依賴...」,這意味着RTTI應該是最後的手段,而不是默認的方法。
這更像是一個選項,然後是一個真正的答案,所以不要讓我陷入死亡。
class Derived;
class Base
{
public:
virtual Derived * getDerived()const
{
return NULL;
}
};
class Derived : public Base
{
public:
virtual Derived * getDerived()const
{
return this;
}
};
我猜你得到的圖片...
附: Mike Seymour,感謝:-)
嗯,這是事實,你想做你想做的事情,這是你的設計可以做一個返工的標誌。如果您需要*,請使用'dynamic_cast'。 –
也許這只是我,但我懷疑你的設計有點不對。 – jrok
出於興趣,什麼樣的情景會要求你這樣做? –