私の衝突コードでは、各エンティティがオーバーライドされ、他のエンティティとの相互作用が定義されていればうまくいくと思いました。だから、私はこれを実装しようとした:メソッドをオーバーライドしてshared_ptrで呼び出す際の異常な動作
Entity.h:
class Bullet;
class Person;
class Entity
{
public:
Entity();
~Entity();
virtual void resolveCollision(Entity &other);
virtual void resolveCollision(Bullet &other);
virtual void resolveCollision(Person &other);
};
Entity.cpp:
void Entity::Entity() {}
void Entity::~Entity() {}
void Entity::resolveCollision(Entity &other) {
std::cout << "collided entity with entity" << std::endl;
}
void Entity::resolveCollision(Bullet &other) {
std::cout << "collided entity with bullet" << std::endl;
}
void Entity::resolveCollision(Person &other) {
std::cout << "collided entity with person" << std::endl;
}
Person.h:
#include "Entity.h"
class Person :
public Entity
{
public:
Person();
~Person();
void resolveCollision(Entity &other) override;
void resolveCollision(Bullet &other) override;
void resolveCollision(Person &other) override;
};
Person.cpp:
Person::Person() {}
Person::~Person() {}
void Person::resolveCollision(Entity &other) {
std::cout << "collided person with entity" << std::endl;
}
void Person::resolveCollision(Bullet &other) {
std::cout << "collided person with bullet" << std::endl;
}
void Person::resolveCollision(Person &other) {
std::cout << "collided person with person" << std::endl;
}
Bullet.h(Person.hのほぼレプリカ):
#include "Entity.h"
class Bullet :
public Entity
{
public:
Bullet();
~Bullet();
void resolveCollision(Entity &other) override;
void resolveCollision(Bullet &other) override;
void resolveCollision(Person &other) override;
};
Bullet.cpp(Person.cppのほぼレプリカ):
Bullet::Bullet() {}
Bullet::~Bullet() {}
void Bullet::resolveCollision(Entity &other) {
std::cout << "collided bullet with entity" << std::endl;
}
void Bullet::resolveCollision(Bullet &other) {
std::cout << "collided bullet with bullet" << std::endl;
}
void Bullet::resolveCollision(Person &other) {
std::cout << "collided bullet with person" << std::endl;
}
最後に、main.cppに:
いくつかの奇妙な理由#include "Bullet.h"
#include "Person.h"
#include <typeinfo>
int main()
{
std::vector<std::shared_ptr<Entity>> entities;
entities.push_back(std::shared_ptr<Person>(new Person()));
entities.push_back(std::shared_ptr<Bullet>(new Bullet()));
std::cout << typeid(entities[0]).name() << std::endl;
std::cout << typeid(*entities[0]).name() << std::endl;
std::cout << typeid(entities[1]).name() << std::endl;
std::cout << typeid(*entities[1]).name() << std::endl;
(*entities[0]).resolveCollision(*entities[1]);
Person().resolveCollision(Bullet());
return 0;
}
、コンソールは、次を出力:
class std::shared_ptr<class Entity>
class Person
class std::shared_ptr<class Entity>
class Bullet
collided person with entity
collided person with bullet
したがって、* entities [1]はクラスBulletですが、なんらかの理由でPerson :: resolveCollision(Bullet)ではなくPerson :: resolveCollision(Bullet)を呼び出します。同じことをすると、プレーヤーと弾丸の間に衝突が発生します。これを引き起こすために私は何をしていますか?フォワード宣言が原因ですか?
ありがとうございました!
[C++のベースクラスへのポインタが与えられたときに派生クラスオブジェクトの関数がオーバーロードされないのはなぜですか?](http://stackoverflow.com/questions/22658316/why-is-not-overloaded-function -for-derived-class-object-invoked-when-given-a-poi) –