我的問題是:「我如何實現處理不同子類但能訪問來自兩個基類的方法的泛型函數?從另一個基類的多個繼承和通用訪問一個基類
我請你想象,我使用的結構如下假設的圖形庫:
class Shape
{
// getters and setters are here
private:
int m_BorderColor;
int m_FillColor;
}
class Square : public Shape
{
}
class Triangle : public Shape
{
}
class TextBox : public Shape
{
}
...等等。
該庫只允許將Shape基類的衍生物添加到其假設畫布中。在我的應用程序中,我希望在每個形狀和可能的其他屬性中都有一個文本框。
因此,我想有自己的基類,類似如下:
class MyBase
{
public:
SetText (string text) { m_Text.Text = text; }
// other getters and setters here
private:
TextBox m_Text;
int m_Id;
}
然後我就可以有「我」的形狀與文本框,如下所示:
class MySquare : public Square, public MyBase
{
}
我可以將MySquare添加到畫布,因爲它是Shape的子類。當用戶雙擊MySquare(或MyTriangle等)時,我想更改文本。但我只知道在運行時點擊哪個形狀。
以下顯然行不通,因爲的setText不是外形與我從庫中接收所述指針的構件,儘管(例如)是一種MyTriangle,被轉換爲外形:
// double click handler
Shape* clicked_shape = clickEvent.GetShape();
clicked_shape->SetText("Foo");
我需要使用基類指針,因爲我不知道直到運行時纔得到哪個形狀對象。因此,雖然以下工作正常,但對我無用:
// double click handler
Shape* clicked_shape = clickEvent.GetShape()
((MyTriangle*)clicked_shape)->SetText("Foo")
謝謝您對此問題的任何見解或更好的模式!
dynamic_cast是最後的手段。在很多情況下,這表明設計不好。但有些時候這是不容易避免的。 – dmitri
@dmitri我同意;我不經常使用它。但這正是它設計的問題類型。 –
我嘗試了這樣的東西,但與static_cast。問題是,取決於哪個形狀是MyBase部分的偏移量不同,所以SetText訪問器崩潰。對不起,但dynamic_cast解決了這個問題嗎? – iwbnwif