2014-10-14 5 views
0

Я начинаю работать с наследованием в C++, но не могу понять, как вызвать метод из подкласса, если этот подкласс находится в массиве элементов его суперкласса , Когда я пытаюсь вызвать метод подкласса, он просто вызывает метод суперкласса.Вызов метода экземпляра подкласса в массиве

Это код, который я имею в main.cpp:

#include "SDL.h" 
#include <iostream> 
#include "shape.h" 
#include "rectangle.h" 

SDL_Surface * screen; 
bool running = true; 

rectangle Rectangle; 
shape * Shapes[] = { &Rectangle }; // The array Shapes is initialized containing Rectangle 

int main(int argc, char** argv) { 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE); 
    while (running) { 
     // Rectangle.draw(screen); This calls the rectangle draw method fine 
     Shapes[0]->draw(screen); // This calls the shape draw method instead 
    } 

    return 0; 
} 

форма и прямоугольник являются два класса, я работаю с; прямоугольник является подклассом формы. Как форма, так и прямоугольник имеют функцию draw(). Метод рисования в форме пуст, поэтому при его вызове ничего не происходит. Метод draw в прямоугольнике содержит только SDL_Quit(), поэтому, если он называется экраном SDL_Surface, он закроется. Но когда я вызываю Shapes[0]->draw(screen), он вызывает метод draw в классе фигур, а не в классе прямоугольника, хотя Shapes[0] является экземпляром прямоугольника. Когда я вызываю draw() на объект Rectangle, он вызывает метод draw() из прямоугольника. Почему это?

+1

Просьба показать нам определения обоих классов. Я предполагаю, что оба метода не являются виртуальными, или их подписи отличаются. – cdhowie

ответ

0

Вы должны объявить любую функцию, которая может быть переопределена подклассами как virtual.

class Shapes { 
    // Some implementation information... 
    virtual void draw(SDL_Surface *screen); 
}; 

class Rectangle : public Shapes { 
    // This method will override the Shapes version. 
    // You do not have to declare it virtual, IIRC, but it's advisable. 
    virtual void draw(SDL_Surface *screen); 
}; 
Смежные вопросы