Почему нельзя использовать нестатический метод родительского класса для объектов классов потомков
Возникла проблема при наследовании c++. Еще разбираюсь в ООП, но ситуация такая. Есть родительский класс Entity с нестатическим методом getrect(). Есть классы потомки для Entity, в данном случае Platform. Метод класса Entity getrect() не является статическим, то есть должен быть доступен в классах потомках просто по имени самого метода(так как является одинаковым для всех объектов классов потомков). Но по какой-то причине, выводит сообщение об неопределенном идентификаторе getrect() в реализации метода класса наследника. Прилагаю скрины ниже.
Заголовочный файл родительского класса:
#pragma once
#include <SFML/Graphics.hpp>
using namespace sf;
class Entity
{
public:
Texture texture;
Sprite sprite;
String name;
int x, y;
float w, h;
public:
Entity(Image image, String Name, float x, float y, int w, int h);
// Функция. Возвращает координаты, ширину и высоту персонажа
FloatRect getRect();
};
А вот его реализация
#include "Entity.h"
Entity::Entity(Image image,String Name, float x, float y,int w, int h)
{
texture.loadFromImage(image);
sprite.setTexture(texture);
sprite.setOrigin(w / 2, h / 2);
sprite.setTextureRect(IntRect(0, 0, w, h));
}
// Функция. Возвращает координаты, ширину и высоту персонажа
FloatRect Entity::getRect() {
return FloatRect(x, y, w, h);
}
Заголовочник класса наследника соответственно.
#pragma once
#include "Entity.h"
class Platform :public Entity
{
float dx, dy, moveSpeed;
enum stateObject {left, right, stay};
stateObject state;
Platform(float dx, float dy, float moveSpeed,stateObject state, Image image, String Name, float x, float y, int w, int h);
void control(float time);
void checkCollisionWithMap(float dx);
};
Реализация
#include "Platform.h"
#include "GameField.h"
Platform::Platform(float dx, float dy, float moveSpeed, stateObject state, Image image, String Name, float x, float y, int w, int h):Entity(image,Name,x,y,w,h)
{
this->dx = dx;
this->dy = dy;
this->moveSpeed = moveSpeed;
this->state = state;
}
void checkCollisionWithMap(float dx)
{
// Обход всех объектов карты
for (int i = 0; i < GameField::solidInvisibleobj.size(); i++)
// При пересечении г.г и объектов карты
if (getRect().intersects(obj[i].rect))
{
// Выталкивание персонажа из текстуры
if (obj[i].name == "solid" || obj[i].name == "transporterR" || obj[i].name == "transporterL")
{
if (Dy > 0) { y = obj[i].rect.top - h; moveY = 0; onGround = true; }
if (Dy < 0) { y = obj[i].rect.top + obj[i].rect.height; moveY = 0; }
if (Dx > 0) { x = obj[i].rect.left - w; }
if (Dx < 0) { x = obj[i].rect.left + obj[i].rect.width; }
}
// Передвижение г.г при пересечении с конвеерами
if (obj[i].name == "transporterR")
{
collisTransporterR = true;
}
else
{
collisTransporterR = false;
}
if (obj[i].name == "transporterL")
{
collisTransporterL = true;
}
else
{
collisTransporterL = false;
}
if ((obj[i].name == "JumpPlatform") && (moveY > 0) && (onGround == false))
{
moveY = -0.8;
}
if (obj[i].name == "deathItem")
health = 0;
if (obj[i].name == "Exit")
GoNextLevel = true;
}
}
void Platform::control(float time)
{
switch (state)
{
case Platform::left: dx = -moveSpeed;
break;
case Platform::right:dx = moveSpeed;
break;
case Platform::stay: dx = 0;
break;
};
x += dx * time;
}