У меня есть Hedgehog
класс, который наследует Body2D
класс. Я хочу, чтобы Hedgehog
использовал функцию рисования Body2D
по умолчанию (это render(SDL_Surface* )
), потому что в этом случае она не имеет поведения c, специфичного для класса, но у меня есть ошибка:
||=== Build: Debug in SDLApples (compiler: GNU GCC Compiler) ===|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp||In function ‘int main(int, char**)’:|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|84|error: ‘void Body2D::render(SDL_Surface*)’ is inaccessible within this context|
engine/include/Body2D.h|37|note: declared here|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|84|error: ‘Body2D’ is not an accessible base of ‘Hedgehog’|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|85|error: ‘void Body2D::render(SDL_Surface*)’ is inaccessible within this context|
engine/include/Body2D.h|37|note: declared here|
/home/maggistrator/Development/cpplabs/labs/Hetchehog and Apples/SDLApples/src/main.cpp|85|error: ‘Body2D’ is not an accessible base of ‘Apple’|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
Мой Hedgehog
класс - это просто простое тело, которое перемещается с одной стороны экрана на другую и обратно. Вот это исходный код . Body2D
класс - это абстрактное тело в 2D мире, которое можно рисовать, обновлять и взаимодействовать с другими телами в одном и том же World
. Вот заголовочный файл Body2D
и source . И вот main
, который их вызывает:
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <SDL/SDL.h>
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
#include "Hedgehog.cpp"
#include "Apple.cpp"
#include "World.h"
#include <vector>
#define APPLE_COUNT 5
int main ( int argc, char** argv )
{
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
atexit(SDL_Quit);
// create a new window
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32,
SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !screen )
{
printf("Unable to set 640x480 video: %s\n", SDL_GetError());
return 1;
}
//------------------------------------------------------------------
//OBJECTS HERE
World scene;
Hedgehog hg(440, 280, scene);
std::vector<Apple> apples;
for(int i = 0; i < APPLE_COUNT; i++)
{
apples.push_back(Apple(i*100, -50, scene));
}
//------------------------------------------------------------------
// program main loop
bool done = false;
while (!done)
{
//======message processing loop======
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
// check for keypresses
case SDL_KEYDOWN:
{
if (event.key.keysym.sym == SDLK_ESCAPE) done = true;
if (event.key.keysym.sym == SDLK_RETURN) ; //Apples fall here
break;
}
} // end switch
} //======end of message processing=====
// UPDATE
hg.update();
for(Apple apple: apples) apple.update();
// RENDER
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
hg.render(screen);
for(Apple apple: apples) apple.render(screen);
SDL_Flip(screen);
} // end main loop
printf("Exited cleanly\n");
return 0;
}
Итак, вопрос: могу ли я использовать функцию базового класса, не переопределяя ее? Или поведение по умолчанию разрешено только для объектов самого базового класса?
ps Я изучал Java в течение нескольких лет, но теперь я должен использовать C ++, поэтому, может быть, я делаю какую-то распространенную ошибку Java -программиста в понимании языкового видения наследования?