2016-12-20 13 views
-1
#include <iostream> 
#include <vector> 
using std::cout; 
using std::cin; 
using std::endl; 

class base { 
    int data; 
public: 
    base(int d = 100) : data(d) {} 
    virtual int getData() const {return data;} 
}; 

class derived : public base { 
    int dData; 
public: 
    derived(int dd = 32) : base(), dData(dd) {} 
    virtual ~derived(){} 
    int getData() const {return dData;} 
}; 



int main(){ 
    std::vector<base> vec; 
    base A(20); 
    derived B(32); 

    vec.push_back(A); 
    vec.push_back(B); 

    for(unsigned int i=0; i < vec.size(); i++) 
     cout << "vector[" << i << "] :" << vec[i].getData() << endl; 

    base * ptr; 
    ptr = &A; 
    cout << "Base pointing: " << ptr->getData() << endl; 

    ptr = &B; 
    cout << "Derived pointing: " << ptr->getData() << endl; 

} 

上面的代碼,我創建一個向量是基類型,並把一個派生的對象在它。當我嘗試讀取值我不能得到正確的。即使我把虛擬語句放在我的類中具有相同名稱的函數之前。但在指針方面沒有問題。多態性在向量

這裏是代碼的輸出。

vector[0] :20 
vector[1] :100 
Base pointing: 20 
Derived pointing: 32 
+0

運行時多態性適用於指針和引用。您的向量包含基地,因此稱爲基礎方法。 – user1438832

回答

0
int main(){ 
    std::vector<base *> vec; 
    base A(20); 
    derived B(32); 

    vec.push_back(&A); 
    vec.push_back(&B); 

    for(unsigned int i=0; i < vec.size(); i++) 
     cout << "vector[" << i << "] :" << vec[i]->getData() << endl; 

    base * ptr; 
    ptr = &A; 
    cout << "Base pointing: " << ptr->getData() << endl; 

    ptr = &B; 
    cout << "Derived pointing: " << ptr->getData() << endl; 

} 

那麼,當我使用指針基矢量,它給正確的值。謝謝您的回答。