kan man i c++ overrida funktioner från lägre bas klass om dom inte är virtuella?

Permalänk
Medlem

kan man i c++ overrida funktioner från lägre bas klass om dom inte är virtuella?

kan man i c++ overrida funktioner från lägre bas klass om dom inte är virtuella?

För när jag har en klass tex

////////////////////////////////////////////////////////
#include "SDL/SDL.h"
#include <string>
#include "SDL/SDL_mixer.h"
#include "SDL/SDL_image.h"
using namespace std;

#ifndef PLAYER_H
#define PLAYER_H

class Model;

class Player {
private:
Model *model;
SDL_Rect *camera;
SDL_Rect hitbox;
int left;
int right;
int up;
int down;

public:
Player();
Player(Model *lol);
~Player(){}
void drawPlayer(SDL_Surface *screenen);
void updatePlayer();
void handleinput(SDL_Event keypressed);
Model *getModel();
void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip);
void setCamera();
SDL_Rect *getCamera();

void setHitBox(int x,int y,int w,int h);
void addHitx(int x);
void addHity(int y);

SDL_Rect getHitbox();

void setLeft(int temp);
void setRight(int temp);
void setUp(int temp);
void setDown(int temp);

int getLeft();
int getRight();
int getUp();
int getDown();

};

#endif

////////////////////////////////////////////////////////////////////////////

och denna

#include "SDL/SDL.h"
#include <string>

using namespace std;

#ifndef StandardPlayer_H
#define StandardPlayer_H

class StandardPlayer: public Player{
private:
SDL_Surface *test;

public:

StandardPlayer();
StandardPlayer(Model *lol);
~StandardPlayer(){}
void drawPlayer(SDL_Surface *screenen);
void updatePlayer();
void handleinput(SDL_Event keypressed);
};

#endif

//////////////////////////////////////////////////////////////////////////////

skriver jag sen såhär

player = new StandardPlayer(this);

så struntar den i att det är en standplayer och bara kör med players funktioner när jag tex skriver

player->drawPlayer(screenen);

Jag har fått det att gå med en annan klass men den bas klassen kör med virtuella funktioner, måste man det?
Ifall så är fallet är det ju helt värdelöst.

Permalänk
Hedersmedlem

Re: kan man i c++ overrida funktioner från lägre bas klass om dom inte är virtuella?

Citat:

Ursprungligen inskrivet av hawy
Jag har fått det att gå med en annan klass men den bas klassen kör med virtuella funktioner, måste man det?
Ifall så är fallet är det ju helt värdelöst.

Varför är det värdelöst, det är väl bara att använda virtuella funktioner istället? Annars kan man alltid (ofta) konvertera sin pekare innan man anropar funktionen.
static_cast<StandardPlayer*>(player)->drawPlayer(screenen);

Permalänk
Medlem

Det är väll rätt kasst om man inte kan ha en funktion för sin bas klass utan att den måste vara virtuell..., då måste man ju sätta en ännu lägre klass före.
Aja får väll göra den virtuell.tack för svaret.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av hawy
Det är väll rätt kasst om man inte kan ha en funktion för sin bas klass utan att den måste vara virtuell..., då måste man ju sätta en ännu lägre klass före.

Nja, man får väl bestämma sig för hur man vill ha det. Antingen vill man att den basklasspekare skall hantera objekten som basklassen eller också vill man att objekten skall hanteras som vad de "egentligen" är; det är svårt att göra båda samtidigt. Och om man vet vad man vill kan man som sagt alltid konvertera pekarna själv.

Permalänk
Medlem

Förstår inte riktigt hur du menar men man kan ju bara overrida virtuella klasser vad jag vet..

Permalänk
Medlem

Det jag menade var att ifall man som i java kan ha en bas klass som har några funktioner, definierar du sen en klass som står högre i hierarkin där samma funktions namn finns med så kommer den ta funktionerna från den högre klassen automatiskt.Det funka fint med virtuella iallafall.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hawy
Det jag menade var att ifall man som i java kan ha en bas klass som har några funktioner, definierar du sen en klass som står högre i hierarkin där samma funktions namn finns med så kommer den ta funktionerna från den högre klassen automatiskt.Det funka fint med virtuella iallafall.

Alla funktioner i Java är virtuella.

Funktionsanrop till virtuella funktioner är mer kostsamma än till icke-virtuella funktioner då det sker indirekt genom vtablen.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Eftersom du nämde Java så kanske det är lönt att kolla lite på terminologin. Det var ett tag sen jag höll på med det, men förhoppningsvis sitter det mesta kvar. Någon kan säker korrigera mig om jag har fel.

När du deklarerar en funktion i en C++ klass kan du göra det på tre sätt;
function()
virtual function()
virtual function() = 0

Det man som regel vill använda är alternativ två, då det tillåter överlagring och korrekt användning vid polymorfism (nackdelen är som sagt att det suger lite extra prestanda om det är mycket viktigt). Man kan egentligen använda det på alla funktioner i sina klasser om man inte har en bra anledning till att inte göra det.
Alternativ tre är det som i Java motsvaras av abstract, d.v.s. funktionen implementeras inte i den här klassen, utan i en klass som ärver från den.
Java har egentligen ingen motsvarighet till det första alternativet vad jag vet.

Permalänk
Medlem

Metoder i Java kan vara final vilket betyder att de bara har en implementation och därmed inte är virtuella.

Visa signatur

Alla män är dödliga. Sokrates var dödlig. Alltså är alla män Sokrates.