在数组中调用子类实例的方法

时间:2014-10-14 02:47:17

标签: c++ arrays inheritance subclass

我开始使用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;
}

形状和矩形是我正在使用的两个类; rectangle是shape的子类。形状和矩形都具有draw()功能。形状中的draw方法是空的,因此在调用时没有任何反应。矩形中的绘制方法仅包含SDL_Quit(),因此如果调用它,SDL_Surface屏幕将关闭。但是当我调用Shapes[0]->draw(screen)时,它会调用shapes类而不是矩形类中的draw方法,即使Shapes[0]是矩形的实例。当我在Rectangle对象上调用draw()时,它从矩形调用draw()方法。这是为什么?

1 个答案:

答案 0 :(得分: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);
};