【问题标题】:Accessing correct overloaded virtual function访问正确的重载虚函数
【发布时间】:2014-12-01 17:43:53
【问题描述】:

我正在尝试覆盖下面的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 才能访问 clear() 方法由DerivatedGraphicsContext 类。

任何建议将不胜感激!

编辑:

createGraphicsContext(..) 返回osg::GraphicsContext*,它是通过调用一些 Windows API 创建的。

因为 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

【问题讨论】:

  • 你需要确认两件事。 1) 函数签名是否相同 2) osg::GraphicsContext 中的 clear() 函数是否标记为虚拟
  • 试试... = &dynamic_cast<DerivatedGraphicsContext&>(*osg::GraphicsContext::createGraphicsContext(..));并告诉我们结果
  • 第三件事:createGraphicsContext() 真的创建了 DerivativedGraphicContext 吗?因为转换对象指针不会改变对象在构造时获得的虚函数...
  • 是的,在 osg::GraphicsContext 中 clear() 函数是虚拟的,两者都有返回类型 void 没有任何参数。的:... = &dynamic_cast<DerivatedGraphicsContext&>(*osg::GraphicsContext::createGraphicsCo‌​ntext(..)); 导致 std::bad_cast 异常。 createGraphicsContext() 返回一个osg::GraphicsContext*,这就是我进行强制转换的原因。
  • 如果在创建对象的时候就决定了虚函数,我想应该可以新建一个DerivatedGraphicsContext,然后从osg::GraphicsContext复制数据,有点类似思路@JohannesSchaub-litb 的

标签: c++ function overriding virtual


【解决方案1】:

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

【讨论】:

  • 工厂方法不是旨在创建一个新的 DerivatedGraphicsContext 吗?当我想从 createGraphicsContext 方法中使用指向 osg::GraphicsContext* 的指针时?
  • 是的,您应该创建新的工厂方法来创建 DerivatedGraphicsContext 类的对象。在 C++ 语言中,对象的运行时类型在该对象的生命周期内不能更改。已经创建的 GraphicsContext 实例不能成为 DerivatedGraphicsContext 实例。因此,在您的工厂方法中,您可以使用现有 GraphicsContext 对象中的一些数据来创建一个全新的 DerivatedGraphicsContext 对象。
  • 根据我通过阅读工厂方法的理解,我需要使用 new 关键字来创建 DerivatedGraphicsContext 的对象,这是不可能的,因为它是一个抽象类,因为它的纯虚函数
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 2017-08-06
  • 2023-01-07
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多