내 충돌 코드의 경우 각 엔티티가 다른 엔티티와 자체 상호 작용을 정의하면 깔끔할 것이라고 생각했습니다.메소드 오버라이드 및 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 :
class std::shared_ptr<class Entity>
class Person
class std::shared_ptr<class Entity>
class Bullet
collided person with entity
collided person with bullet
: 약간 이상한 이유로
#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;
}
는 콘솔 다음 출력
그래서 엔티티 [1]이 클래스 글 머리 기호라는 것을 인식하는 것 같지만, 어떤 이유로 인해 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) –