Jos*_*ury 2 c++ inheritance pointers
我有以下代码
#include <iostream>
#include <vector>
class Entity {
public:
virtual void func() = 0;
};
class Monster : public Entity {
public:
void func();
};
void Monster::func() {
std::cout << "I AM A MONSTER" << std::endl;
}
class Buddha : public Entity {
public:
void func();
};
void Buddha::func() {
std::cout << "OHMM" << std::endl;
}
int main() {
const int num = 5; // How many of each to make
std::vector<Entity*> t;
for(int i = 0; i < num; i++) {
Monster m;
Entity * e;
e = &m;
t.push_back(e);
}
for(int i = 0; i < num; i++) {
Buddha b;
Entity * e;
e = &b;
t.push_back(e);
}
for(int i = 0; i < t.size(); i++) {
t[i]->func();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,它们都打印出"佛"消息,而不是每个类打印出自己的消息.我希望每个对象都能打印出自己的信息:怪物打印出怪物信息,佛像打印佛信息.
我做错了什么?
das*_*ang 13
您需要使用"new"从堆中分配对象.这里发生的是你正在创建临时对象,将指针指向这些对象,然后这些对象被破坏.是的,这与许多其他语言不同.:)
相反,尝试:
int main() {
const int num = 5; // How many of each to make
std::vector<Entity*> t;
for(int i = 0; i < num; i++) {
Monster* m = new Monster;
t.push_back(m);
}
for(int i = 0; i < num; i++) {
Buddha* b = new Buddha;
t.push_back(b);
}
for(int i = 0; i < t.size(); i++) {
t[i]->func();
}
// This is very important!
for(int i = 0; i < t.size(); i++) {
delete t[i];
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当你看到这样奇怪的行为时,请检查实际向量的内容.你会发现你所有的老虎机都有相同的价值,这就是堆叠上持有临时怪物然后是临时大佛的位置.