gpt4 book ai didi

c++ - 为什么继承的函数会忽略在原始函数中调用的重写函数?

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:22 24 4
gpt4 key购买 nike

它之前工作正常并且功能没有被忽略。我对 HLSL 着色器做了一些更改,并添加了两个重载函数(RenderUpdateBuffers),在它工作和停止工作之间添加了一个额外的 XMFLOAT4 参数,我认为不应该影响它。

我有一个名为 TexturedRect 的类和一个派生类 TexturedSpritesheet。名为 Render 的函数调用 UpdateBuffers,它在 TexturedSpritesheet 中被覆盖。

当我调用 TexturedSpritesheet::Render 时,它会忽略覆盖并使用 TexturedRect::UpdateBuffers

TexturedRect.h(仅包括与问题相关的行):

public:
bool Render(ID3D11DeviceContext*, int, int);
bool Render(ID3D11DeviceContext*, int, int, DirectX::XMFLOAT4);
protected:
bool UpdateBuffers(ID3D11DeviceContext*, int, int);
bool UpdateBuffers(ID3D11DeviceContext*, int, int, DirectX::XMFLOAT4);

TexturedRect.cpp(仅包括与问题相关的行):

bool TexturedRect::Render(ID3D11DeviceContext* deviceContext, int positionX, int positionY) {
bool result;
m_posX = positionX;
m_posY = positionY;
result = UpdateBuffers(deviceContext, positionX, positionY);
if (!result) return false;

RenderBuffers(deviceContext, false);

return true;
}

bool TexturedRect::Render(ID3D11DeviceContext* deviceContext, int positionX, int positionY, DirectX::XMFLOAT4 color) {
bool result;
m_posX = positionX;
m_posY = positionY;
result = UpdateBuffers(deviceContext, positionX, positionY, color);
if (!result) return false;

RenderBuffers(deviceContext, true);

return true;
}

TexturedSpritesheet.h(仅包括与问题相关的行):

protected:
bool UpdateBuffers(ID3D11DeviceContext*, int, int);
bool UpdateBuffers(ID3D11DeviceContext*, int, int, DirectX::XMFLOAT4);

最佳答案

为了在派生类中重新定义成员函数,必须将其标记为虚函数。这将允许程序通过引用 vtable(类维护的函数指针表)来解析要在运行时调用的实际函数。

TextureRect.h 的头文件应为:

virtual bool UpdateBuffers(ID3D11DeviceContext*, int, int);
virtual bool UpdateBuffers(ID3D11DeviceContext*, int, int, DirectX::XMFLOAT4);

另请注意,无论何时从类继承,最好将基类析构函数也声明为虚函数。如果您需要释放析构函数中的任何内存,这将使您以后不再头疼。

关于c++ - 为什么继承的函数会忽略在原始函数中调用的重写函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50264356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com