我仍然是C ++的新手,继承让我陷入困境。 我知道这在C#中有效,因为我总是使用Base。();
我希望能够调用从Entity派生的PlayerCharacter矢量数组。 目前,当我调用它时,它只调用Entity的更新方法。
int main()
{
vector<Entity*> list;
list.push_back(&PlayerCharacter());
for(int i = 0; i < list.size(); i++)
{
list[0]->Update();
}
}
class Entity
{
public:
Entity(void);
~Entity(void);
int hitpoints;
virtual void Update(void);
};
void Entity::Update(void)
{
int a = 0;
a++;
}
class PlayerCharacter : public Entity
{
public:
PlayerCharacter(void);
~PlayerCharacter(void);
bool Move();
void Update() override;
};
void PlayerCharacter::Update(void)
{
int a = 0;
a--;
}
答案 0 :(得分:4)
list.push_back(&PlayerCharacter());
我认为这是代码中未定义的行为。
在你的情况下,你应该在堆上分配数据:list.push_back( new PlayerCharacter() );
否则如果你这样做&PlayerCharacter()
那么PlayerCharacter变量将被立即销毁,列表中的指针将指向垃圾字节。
另外,为了跟踪调用哪个函数,您可以使用调试器或从每个Update函数在控制台中打印一些内容。
答案 1 :(得分:-1)
这个作品: 但是几乎没有变化:1)你不需要放置Override 2)一旦声明了构造函数和析构函数的定义3)创建派生类的对象并将其传递给列表。
输出为:Inside PlayerCharacter
如果要调用基类更新方法方法,请删除volatile关键字。或者使用指向基类对象的基类指针。
class Entity
{
public:
Entity();
~Entity();
int hitpoints;
virtual void Update(void);
};
Entity::Entity()
{
}
Entity::~Entity()
{
}
void Entity::Update(void)
{
std::cout << " Inside Entity" <<std::endl;
int a = 0;
a++;
}
class PlayerCharacter : public Entity
{
public:
PlayerCharacter();
~PlayerCharacter();
bool Move();
void Update();
};
void PlayerCharacter::Update(void)
{
std::cout << " Inside PlayerCharacter" <<std::endl;
int a = 0;
a--;
}
PlayerCharacter::PlayerCharacter()
{
}
PlayerCharacter::~PlayerCharacter()
{
}
int main()
{
vector<Entity*> list;
PlayerCharacter ObjPlayerCharacter;
list.push_back(&ObjPlayerCharacter );
for(unsigned int i = 0; i < list.size(); i++)
{
list[0]->Update();
}
}