2010-07-27 44 views
3

當我使用指向繼承類的指針調用基類函數時,爲什麼會出現編譯錯誤?繼承和指向指針的指針:爲什麼它不工作,我該如何解決它?

例子:

class cFoo {}; 
class cBar : public cFoo {}; 
void func1(cFoo *) {} // base class 
void func2(cFoo **) {} // base class 

void main(void) 
{ cBar bar, *pbar; // inherited class 

    func1(&bar); // compiles OK 
    func2(&pbar); // fail 
    func2(dynamic_cast<cFoo**>(&pbar)); // 'class cFoo ** ' : invalid target type for dynamic_cast 
} 

如何解決此得到什麼?

回答

2

它不工作,因爲dynamic_cast工作在指針或對類的引用。而你正試圖在指向指針的指針上使用它。

簡單的解決將是這樣的:

func2(&dynamic_cast<cFoo*>(pbar)); 
+2

這不是暫時的地址嗎?這是真的嗎? – 2010-07-27 12:11:16

+1

@Anders那麼'dynamic_cast '然後呢? – 2010-07-27 13:24:29

6

考慮以下幾點:

class cFoo {}; 
class cBar : public cFoo {}; 
void func1(cFoo *) {} 
void func2(cFoo **p) { *p = new cFoo; } // modify pointee 

void main(void) 
{ cBar bar, *pbar; // inherited class 

    func1(&bar); // compiles OK 

    func2(&pbar); 
} 

是否奏效,就必須設法把一個Cfoo的對象爲C杆指針沒有編譯器錯誤,並且類型系統將被破壞。動態演員陣營將無濟於事,因爲演員無法阻止傷害。

0

你試圖做的是有缺陷的。

(非常量)指針指針作爲函數參數的典型用例是該函數將修改參數以指向某個實例的指針。

是選擇實例的函數。 以工廠方法爲例。

參數類型描述函數保證有效的類型。

如果你的函數保證實例是一個cBar,那麼它應該採用一個cBar **參數。

因爲它需要一個cFo​​o **它只能保證該對象是一個有效的cFoo。

在當前的表單中,如果您強制進行強制轉換,您將導致任何類型的cFoo被暴露爲cBar - 即使情況並非如此。

+0

是的,我懷疑這是問題。我不能指望func2()知道它正在傳遞一個cBar **。在現實生活中,我正在做TomW上面顯示的內容(分配內存)。 嘆息......我可以解決它,但它不會那麼優雅。 謝謝大家的及時和專家的幫助。 – Pierre 2010-07-27 14:36:36

相關問題