2016-12-20 12 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; 

} 

上記のコードの上で、私は基底の型であるベクトルを作成し、そこに派生オブジェクトを入れます。私が値を読み取ろうとすると、私は正しいものを得ることができません。私は私のクラスで同じ名前を持つ関数の前に 'virtual'ステートメントを置いています。しかし、ポインタの方法で問題はありません。ベクトルの多型

ここにコードの出力があります。

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; 

} 

私はポインタ基底ベクトルを使用する場合まあ、それは正しい値を示します。あなたの答えをありがとう。