2015-04-07 17 views
0

我想學習C++,做一些測試,我有以下問題,其中,以一種方式顯示一件事,另一件按預期工作,我會嘗試解釋盡我所能,「對不起我的英語」,我有一個或多或少的基礎課,所以我認爲這是重要的部分;爲什麼如此?堆,顯示了一件事,然後另一個

class Basefptr { 
public: 
    Basefptr(); 
    virtual ~Basefptr(); 
    virtual void funcPtr1(); 
}; 

inline void Basefptr::funcPtr1(){ 
    std::cout << "funcPtr1" << std::endl; 
} 
#endif /* BASEFPTR_H_ */ 

以及在派生類中的其他;

#include "Basefptr.h" 

class Derivada : public Basefptr { 
public: 
    Derivada(); 
    virtual ~Derivada(); 
    virtual void funcPtr1(); 
}; 

inline void Derivada::funcPtr1(){ 
    std::cout << "funcPtr1_de_Derivada" << std::endl; 
} 
#endif /* DERIVADA_H_ */ 

這是主要的;

#include "Basefptr.h" 
#include "Derivada.h" 
#include <vector> 
#include <algorithm> 

int main(int argc, char* argv[]){ 

Basefptr* base  = new Basefptr; 
Derivada* derivada = new Derivada; 

std::vector<Basefptr*> poli; 

poli.push_back(base); 
poli.push_back(derivada); 


std::for_each(poli.begin(), poli.end(),[](Basefptr* b){ 

    b->funcPtr1(); 
}); 


Basefptr base1; 
Derivada derivada1; 

std::vector<Basefptr> poli1; 

poli1.push_back(base1); 
poli1.push_back(derivada1); 


std::for_each(poli1.begin(), poli1.end(),[](Basefptr b){ 

    b.funcPtr1(); 
}); 

return 0; 
} 

這個殼出來了;

funcPtr1 
funcPtr1_de_Derivada 

funcPtr1 
funcPtr1 

前兩行如預期,但第二個是不是我所期待的,因爲他認爲會像第一個,有人可以解釋我,這是如此,究其原因,如果你請。還是我在做錯誤的問候和感謝閱讀。

+2

用調試信息和所有警告編譯你的程序(例如'g ++ -Wall -Wextra -g',如果使用[GCC](http://gcc.gnu.org/)....)。然後使用調試器(例如'gdb')一步一步地運行它。 –

+0

順便說一句你的問題不清楚。您期待前兩條輸出線,然後說第二條線不是我的預期。閱讀[虛擬方法表](https://en.wikipedia.org/wiki/Virtual_method_table) –

+2

查找「對象切片」。 – Angew

回答

3

std::vector<Basefptr> poli1; 

告訴矢量保持Basefptr類型的對象。當你

poli1.push_back(base1); 
poli1.push_back(derivada1); 

的載體是創建一個Basefptr構造新的對象,它擁有本身。這些不是您創建的對象。

+0

清除你真正的邏輯,謝謝你的答案,只有我只能upvote,我現在不會讓你接受你的回答,但我會在將來謝謝你 –

相關問題