C++ C++;-对象切片对象保持对象向量

C++ C++;-对象切片对象保持对象向量,c++,object-slicing,C++,Object Slicing,所以我正在做一个项目,目前我正在尝试渲染纹理。当前矩形纹理从纹理继承。RectTextures有自己的render()函数,因为我希望其他类型的纹理(如文本)以不同的方式渲染 然后我创建了从RectTexture继承的象限。但是,象限可以容纳纹理向量。当我渲染象限时,我想渲染它和它包含的所有内容。 为此,象限有自己的渲染功能。在这个函数中,它渲染自身(这是一个矩形纹理),然后循环遍历向量中的每个对象并渲染它们 现在问题来了。当我用RectTexture填充象限时,render()函数将调用Tex

所以我正在做一个项目,目前我正在尝试渲染纹理。当前矩形纹理从纹理继承。RectTextures有自己的render()函数,因为我希望其他类型的纹理(如文本)以不同的方式渲染

然后我创建了从RectTexture继承的象限。但是,象限可以容纳纹理向量。当我渲染象限时,我想渲染它和它包含的所有内容。 为此,象限有自己的渲染功能。在这个函数中,它渲染自身(这是一个矩形纹理),然后循环遍历向量中的每个对象并渲染它们

现在问题来了。当我用RectTexture填充象限时,render()函数将调用Texture的,而不是RectTexture!! 我被告知这是因为切片,我需要使用指针。我已经实现了这一点,但没有任何改变。。。 由于这个项目相当大,为了清晰起见,我在其中加入了一个简短的版本,其中移动了一些变量

MainGame::MainGame(){
    _window = NULL;
    _renderer = NULL;
    _screenWidth = 1920;
    _screenHeight = 1080;
    _gameState = GameState::PLAY;
}


MainGame::~MainGame(){
}
    // Quadrants
vector<Quadrants*> _quadrants;
    //Top Left
    _quadrants.push_back(new Quadrant(0, 0, _screenWidth * 2 / 3, _screenHeight * 2 / 3, { 0x00 , 0xFF , 0xFF , 0xFF }, QuadDesc::TLEFT));
    //Top Right
    _quadrants.push_back(new Quadrant(_screenWidth * 2 / 3, 0, _screenWidth * 1 / 3, _screenHeight * 2 / 3, { 0xFF , 0x00 , 0xFF , 0xFF }, QuadDesc::TRIGHT));
    //Bot Left
    _quadrants.push_back(new Quadrant(0, _screenHeight * 2 / 3, _screenWidth * 2 / 3, _screenHeight * 1 / 3, { 0xFF , 0xFF , 0x00 , 0xFF }, QuadDesc::BLEFT));
    //Bot Right
    _quadrants.push_back(new Quadrant(_screenWidth * 2 / 3, _screenHeight * 2 / 3, _screenWidth * 1 / 3, _screenHeight * 1 / 3, { 0x00 , 0xFF , 0x00 , 0xFF }, QuadDesc::BLEFT));



    SDL_Color color = { 255, 255, 255, 255 };
    RectTexture *a = new RectTexture(200, 200, 500, 500, color);
    RectTexture *b = new RectTexture(200, 200, 500, 500, color);
    (*_quadrants[0]).addTexture(a);
    (*_quadrants[0]).addTexture(b);
}
void drawGame() {
    //Clear
    SDL_SetRenderDrawColor(_renderer, 0x00, 0x00, 0x00, 0xFF);
    SDL_RenderClear(_renderer);
    //test quadrants
    for (unsigned int i = 0; i < _quadrants.size(); i++) {
        (*_quadrants[i]).render(_renderer);
    }
    SDL_RenderPresent(_renderer);
}
象限:

RectTexture::render(renderer);
for (unsigned int j = 0; j < (_textures).size(); j++) {
    std::cout << j << "|" << (_textures).size() << "|" << (*_textures[j]).getA() << std::endl;
    _textures[j]->render(renderer);
}
RectTexture::render(渲染器);
对于(无符号整数j=0;j<(_)纹理).size();j++){

std::你能使用虚拟函数吗?这里确实没有足够的信息来恰当地回答你的问题。请显示你的类继承。另外,你的
MainGame
destructor中有很多代码,这些代码要么是打字错误,要么是不合适的。@tegtmeye解构函数几乎立即关闭。不过,看起来好像它们忘记了该方法的方法签名,因为它似乎在类中独立存在,没有方法签名。我不知道virutal!!非常感谢!它现在可以工作了。我还为代码道歉。我删掉了一些片段,因为它们不太相关,我显然犯了一个错误。确保你的析构函数也是虚拟的l否则,完成后将无法正确破坏纹理。
void RectTexture::render(SDL_Renderer* renderer) {
    SDL_SetRenderDrawColor(renderer, getR(), getG(), getB(), getA());
    SDL_Rect rect = { getX(), getY(), getWidth(), getHeight() };
    SDL_RenderFillRect(renderer, &rect);
}
RectTexture::render(renderer);
for (unsigned int j = 0; j < (_textures).size(); j++) {
    std::cout << j << "|" << (_textures).size() << "|" << (*_textures[j]).getA() << std::endl;
    _textures[j]->render(renderer);
}