2013-04-04 75 views
5

雖然我在C++中工作了一段時間,但直到現在我還沒有必要使用多態特性,而且我對它們非常感興趣。基本類的基本多態指針

如果我有一個基類ClassA和另一ClassB提煉出來的,我知道我可以有virtual成員函數ClassA,在ClassB實施後,將在即使實例指出在ClassB實例調用使用ClassA指針。沒有這個virtual關鍵字,我認爲在使用基類指針時基類實現將佔上風,但是它正在對從子類實例化的對象進行操作,這在我看來是有疑問的,實際上ClassB有其自己的實現相同的功能在這種情況下,這被有效地忽略了。

這是對多態行爲的正確理解嗎?

現在真正的問題是如何使用指向基類的指針來引用ClassB。我真的可以只考慮兩種方式:

  1. 在實例化時創建的指針,使用返回一個基類指針,而實際上是子類分配內存,而不是使用子類的構造函數。 (這樣的創建函數是否具有共同名稱?)
  2. 使用static_cast投射對象並將其分配給指向基類的指針。

這些是生成基類指針到子類對象的兩種主要技術嗎?

+0

相關:http://stackoverflow.com/q/5854581/46821 – 2013-04-04 13:25:48

回答

9

最簡單的方法是簡單地分配給它,沒有必要投:

ClassA *ptrA = new ClassB; 

你是正確的,你需要的virtual關鍵字來實現多態行爲。這是考慮它的一種方法。 C++對對象的靜態類型進行操作。當您撥打ptrA->foo()時,指針的類型爲ClassA*。如果該函數沒有被聲明爲virtual,那麼它將盲目地調用ClassA的函數版本。沒有別的選擇。但是,如果foo()virtual,那麼它就知道要停下來問:「等等,我真的是什麼類型的?」在這種情況下的答案是ClassB,所以它會調用ClassB的版本。

另外請注意,你不需要指針來實現這一點。你會看到多態性行動另一種常見的方法是通過函數調用:

void bar(ClassA &aObj) 
{ 
    aObj.foo(); 
} 

// ... 
ClassB bObj; 
bar(bObj); 
+0

+1爲了簡單:) – scones 2013-04-04 13:29:38

+0

實在的,我只是巧合的是在字典中查找了一個單詞,這個詞很優雅*,而且當定義實際上是您在上面提供的確切代碼片段時,我做了一個雙重處理! – johnbakers 2013-04-04 13:31:26

+0

+1指出動態分配和指針是正交於多態(即使經常一起使用)。 – 2013-04-04 14:28:35