2016-04-12 42 views
-1

我有一個類型爲A的對象列表,其中可能包含從A派生的任何數量的類的實例。我在列表中的每個成員上調用一個函數,並且希望函數從最派生的類被調用。但是,調用基類的功能。我怎樣才能讓它成爲使用最派生類的情況?從大多數派生類調用虛函數

以下代碼說明了我的問題。代碼輸出「In a」,但我希望它輸出「In b」。

#include <iostream> 

class A { 
public: 
    virtual void func() 
    { 
     std::cout << "In A" << std::endl; 
    } 
}; 

class B : public A { 
public: 
    virtual void func() 
    { 
     std::cout << "In B" << std::endl; 
    } 
}; 

int main() 
{ 
    A a = B(); 
    a.func(); 
    return 0; 
} 

回答

6

當你

A a = B(); 

你是slicing the object。你擁有的只是A對象的一個​​實例。

爲了讓你需要或者使用引用多態性工作:

B b; 
A& a = b; 

或使用指針

A* a = new B; 
+0

感謝勒夫,這解決了我的問題 – JHobern

+0

或者使用智能指針! std :: unique_ptr和std :: shared_ptr – Ceros

+0

@Ceros這些只是一般指針的變體。而且我也不會推薦使用新的智能指針作爲簡單的自動刪除指針,而是作爲*擁有*模型的一部分。 –

相關問題