访问正确的重载虚函数

时间:2014-12-01 17:43:54

标签: c++ function override virtual

我试图覆盖下面的virtual void clear();

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

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

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

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

我尝试过投射static_castdynamic_cast,但我不确定是否可行,或者我是否需要在派生类中重新实现createGraphicsContext以便{{1 clear()类要访问的方法。

任何建议都将不胜感激!

编辑:

DerivatedGraphicsContext返回createGraphicsContext(..),通过调用某些Windows API来创建它。

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

由于我无法使用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

1 个答案:

答案 0 :(得分:0)

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