簡體   English   中英

使用基類指針在派生類中調用非虛函數

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

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