访问正确的重载虚函数

Accessing correct overloaded virtual function

本文关键字:函数 重载 访问      更新时间:2023-10-16

我正在尝试覆盖下面的virtual void clear();

class DerivatedGraphicsContext : public osg::GraphicsContext {
public:
    void clear() { /* Do something */ }
};

但是,我需要使用 osg::GraphicsContext::createGraphicsContext 方法初始化我的 DerivatedGraphicsContext 对象:

DerivatedGraphicsContext* dgc = (DerivatedGraphicsContext*)osg::GraphicsContext::createGraphicsContext(..);

问题是,当我现在调用dgc->clear();时,它将调用osg::GraphicsContext::clear((方法。

我尝试过static_castdynamic_cast强制转换,但我不确定这是否可能,或者我是否需要在我的派生类中重新实现 createGraphicsContext,以便 DerivatedGraphicsContext 类访问 clear() 方法。

任何建议将不胜感激!

编辑:

createGraphicsContext(..)返回通过调用某些Windows API创建的osg::GraphicsContext*

因为osg::GraphicsContext具有纯虚函数,所以该类是抽象的,如果不实现方法就无法实例化。因此,甚至不可能使用osg::GraphicsContext* gc = new osg::GraphicsContext(),当然DerivatedGraphicsContext也是如此。

由于我无法使用 new 关键字,因此我无法将其内容复制到我可以返回其指针的DerivatedGraphicsContext

来源可在此处获得:

来源: http://trac.openscenegraph.org/projects/osg//browser/OpenSceneGraph/trunk/src/osg/GraphicsContext.cpp

页眉:http://trac.openscenegraph.org/projects/osg//browser/OpenSceneGraph/trunk/include/osg/GraphicsContext

将 createGraphicsContext(..( 调用转换为 DerivatedGraphicsContext* 的结果的可能性显然取决于在 createGraphicsContext 中实际创建的对象及其类。正如你所说的clear((方法在基类osg::GraphicsContext中被描述为虚拟的,我想createGraphicsContext返回值的真正运行时类型与DerivatedGraphicsContext无关。如果这是真的,dynamic_casting DerivatedGraphicsContext* 只会给你 NULL 值。我认为您需要在后代类中实现另一个静态工厂方法,类似于 GraphicsContext::createGraphicsContext,或者使用工厂方法模式来选择要实例化的类。