查看: 1126|回复: 7

关于《最长的一帧》的一个问题

[复制链接]

该用户从未签到

发表于 2014-3-23 17:05:48 | 显示全部楼层 |阅读模式
近日拜读array老师的《最长的一帧》大作,刚开始读第一日开始就遇到了疑惑,求指点。代码如下:
void ViewerBase::frame(double simulationTime)
{
   if(_done)return;

   if(_firstFrame)
     {
         viewerInit();
         
         if(!isRealized())
             reslized();

         _firstFrame = false;
     }

   advanced(simulationTime);
   eventTraversal();
   updateTraversal(1);
   renderingTraversals();
}
    我想问的问题是viewerInit()是ViewerBase中的函数,声明如下:virtual  void viewerInit() = 0;,是个纯虚函数,这个函数在这起什么作用呢?后面的内容还没看,求大神们指点。。。。

该用户从未签到

发表于 2014-3-23 20:35:41 | 显示全部楼层
virtual  void viewerInit() = 0,纯虚函数,强制子类实现(纯虚函数也可以有实现,供子类调用),其他的就跟一般虚函数一样了。

该用户从未签到

 楼主| 发表于 2014-3-24 10:32:02 | 显示全部楼层
在void ViewerBase::frame(double simulationTime)中为什么直接调用ViewInit()纯虚函数呢?有什么其他的作用吗?

该用户从未签到

发表于 2014-3-28 15:09:44 | 显示全部楼层
在ViewerBase的frame中,其不实现,其子类Viewer类中实现,Viewer类中viewerInit()函数的实现是调用Viewer类从View类中继承的init()函数,再追踪其在View中的实现你可以看到如下代码:
void View::init()
{
    OSG_INFO<<"View::init()"<<std::endl;

    osg::ref_ptr<osgGA::GUIEventAdapter> initEvent = _eventQueue->createEvent();
    initEvent->setEventType(osgGA::GUIEventAdapter::FRAME);

    if (_cameraManipulator.valid())
    {
        _cameraManipulator->init(*initEvent, *this);
    }
},这些就是它的作用。

该用户从未签到

 楼主| 发表于 2014-3-29 12:57:22 | 显示全部楼层
恩,这个在后面也有讲到。那osg为什么要在frame函数中调用viewerInit()这个纯虚函数呢,是利用其多态性?还是有其他的考虑?莫非父类ViewerBase的ViewInit()实际上是调用子类Viewer的ViewerInit()?

该用户从未签到

 楼主| 发表于 2014-3-29 12:57:39 | 显示全部楼层
hnwhb360 发表于 2014-3-28 15:09
在ViewerBase的frame中,其不实现,其子类Viewer类中实现,Viewer类中viewerInit()函数的实现是调用Viewer ...

恩,这个在后面也有讲到。那osg为什么要在frame函数中调用viewerInit()这个纯虚函数呢,是利用其多态性?还是有其他的考虑?莫非父类ViewerBase的ViewInit()实际上是调用子类Viewer的ViewerInit()?

该用户从未签到

发表于 2014-3-31 11:16:05 | 显示全部楼层
腾格里 发表于 2014-3-29 12:57
恩,这个在后面也有讲到。那osg为什么要在frame函数中调用viewerInit()这个纯虚函数呢,是利用其多态性? ...

ViewerBase类中的frame()函数调用自身的viewerInit()函数,纯虚函数是用来定义接口的,其具体实现在子类中,这些是纯虚函数的特性

该用户从未签到

 楼主| 发表于 2014-4-2 15:19:36 | 显示全部楼层
hnwhb360 发表于 2014-3-31 11:16
ViewerBase类中的frame()函数调用自身的viewerInit()函数,纯虚函数是用来定义接口的,其具体实现在子类 ...

我知道纯虚函数的特性是什么,只是不理解为什么要在ViewerBase类的frame函数中调用其成员函数ViewerInit(纯虚函数),这样做的作用是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表