![](/img/trans.png)
[英]Is it safe to call a non-virtual base class member function from the base class destructor using a derived class pointer?
[英]Calling a non-virtual function in derived class using a base class pointer
如在此答案中指出的:
對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系統的工作方式相同
我想知道的是,如何在派生類中調用自定義函數...如果沒有更好的方法,而沒有
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;
}
};
我想你知道了...
PS Mike Seymour,謝謝:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.