为什么这样?堆,显示一件事,然后另一件事

时间:2015-04-07 10:19:20

标签: c++

我正在尝试学习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;
}

这个shell出来了;

 funcPtr1 
 funcPtr1_de_Derivada

 funcPtr1 
 funcPtr1

前两行是预期的,但第二行并不是我所期望的,因为他认为这就像第一行,有人可以解释一下,原因就是这样,如果你愿意的话。或者我是在做错误的问候和感谢阅读。

1 个答案:

答案 0 :(得分:3)

该行

std::vector<Basefptr> poli1;

告诉向量保存Basefptr类型的对象。当你

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

向量正在创建具有Basefptr构造函数的新对象,它拥有自己。这些不是您创建的对象。