2012-07-05 45 views
0

我不確定我是否像我喜歡的那樣描述了我的問題,但我會舉例說明清楚。確定哪個派生類指向抽象類的指針設置爲

下面是代碼:

class Shape; 
class Circle; 
class Triangle; 

class Shape 
{ 
    Shape(void); 
    ~Shape(void); 

    virtual void DrawShape(void) = 0; 
} 

class Circle : public Shape 
{ 
    /* .... constructor/destructor defined normally .... */ 
    bool TestIntersection(Triangle* _triangle); 
    bool TestIntersection(Circle* _circle); 
    void DrawShape(void); 
} 

/* main.cpp */ 

... 
Shape* shape; 
Shape* circle = new Circle; 

if(a == 0) 
{ 
    shape = new Circle; 
} 
else 
{ 
    shape = new Triangle; 
} 

circle->TestIntersection(shape); 

我得到的,有從外形*金環*或*三角沒有可接受的轉換中的誤差。

這是怎麼發生的?或者我需要一種方法來確定哪個派生類已被設置爲抽象類指針?

+0

'Circle'不是從'Shape'派生的。另外'circle.'不會工作,因爲'circle'是一個指針。請你可以發佈一些真實的代碼,以避免混淆? – 2012-07-05 11:33:59

+0

[訪問者模式如何避免向下轉換](http://stackoverflow.com/questions/3254788/how-visitor-pattern-avoid-downcasting) – 2012-07-05 11:40:16

+0

(因爲試圖知道派生類型是什麼,是第一步在downcasting) – 2012-07-05 11:40:52

回答

4

通常,你需要這樣的:

我注意到,你沒有從Shape派生的理應派生類。解決這個問題。也就是說,TriangleCircle應該來自Shape。之後,閱讀Visitor模式及其各種實現和用法。這將幫助你解決你的問題。

+1

謝謝,我想這可能只是我正在尋找。非常感謝。 – l3utterfly 2012-07-06 12:44:16

+0

嗯......我讀過訪問者模式,它爲我的代碼應該如何工作提供了很多靈感,但是如果有人能夠給我一個關於如何爲我的代碼實現上述代碼的明確示例,那將非常有幫助。我真的很感激。 (我已經改變了上面的代碼:Circle和Triangle是Shape的派生類型,我只是忘記輸入該位。) – l3utterfly 2012-07-06 14:18:41

0

Circle類似乎並沒有從Shape繼承:

試試這個:

class Circle : Shape 
{ 

} 
+0

這不會解決真正的問題... – 2012-07-05 11:36:59

+0

這是爲什麼?如果Circle從Shape繼承,Shape *可以定義爲一個Circle *。 – MBen 2012-07-05 11:38:16

+0

真正的問題是對'TestIntersection'的調用;沒有重載需要'Shape *'。 – 2012-07-05 11:38:55

0

發生這種情況,因爲你其實並沒有從Shape派生。

class Circle: public Shape { 
... 
}; 
+0

這不會解決真正的問題... – 2012-07-05 11:36:38

+0

標題中的問題?不,但它確實在問題描述結束時回答了問題。至於哪個派生類是它的檢測:有很多方法可以解決它。一個是使用typeid()和type_info,另一個定義了Shape類中的抽象方法,其他人必須使用它來標識自己(意味着維護開銷,但比第一個方法更少的目標代碼) – fork0 2012-07-05 11:41:01

+0

您可以更具體地瞭解如何定義這個抽象方法? – l3utterfly 2012-07-09 09:19:03

相關問題