在GCC和MSVC2010中调用init上的基类构造函数

时间:2013-05-19 09:31:55

标签: c++ gcc

我正在交叉编译从MSVC2010到GCC 4.7的项目。每个我调用基类构造函数的地方都是这样的:

 FPSCamera::FPSCamera(CameraType camType, float fov, int viewportW, int viewportH, float nearPlane, float farPlane)
{
    Camera3D::Camera3D( camType,  fov,  viewportW,  viewportH,  nearPlane,  farPlane);

}

我要进入海湾合作委员会:

  

不能直接打电话给建设者

MSVC不会抱怨......这样就解决了错误:

FPSCamera::FPSCamera(CameraType camType, float fov, int viewportW, int viewportH, float nearPlane, float farPlane)

       :Camera3D( camType,  fov,  viewportW,  viewportH,  nearPlane,  farPlane);

{

}

为什么呢?

2 个答案:

答案 0 :(得分:8)

这是bug in VC++ 2010 - 构造函数是无名的特殊成员函数,不能直接调用。在这种情况下,基类的默认构造函数称为第一个,然后调用基类的参数化构造函数。您可能没有注意到任何问题的原因是this指针在对基础构造函数的两次调用之间是不同的。两个单独的对象似乎正在构建,但只有一个被销毁。根据基类获取的资源,可能存在一些您还不知道的漏洞或错误。

以下示例显示了施工期间发生的情况。

#include <iostream>

class Base
{
public:
    Base()
    {
        std::cout << "Base default ctor. this = " << this << std::endl;
    }
    Base(int)
    {
        std::cout << "Base parameterized ctor. this = " << this << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived()
    {
        std::cout << "Inside derived ctor." << std::endl;
        Base::Base(1);
        std::cout << "Leaving derived ctor" << std::endl;
    }
};



int main()
{
    Derived();
    return 0;
}

结果:

  

基本默认ctor。这= 00000000002FF6F0
  内部衍生的ctor。
  基本参数化ctor。这= 00000000002FF6B0
  离开派生的ctor

[注意:微软没有计划很快解决这个问题]

答案 1 :(得分:1)

发帖作为答案而非评论......

不确定为什么MSVC没有抱怨但你必须在派生类构造函数的初始化列表中初始化基类。

这样做的原因是当你在类的类构造函数的主体中时,包含了基本的clases已经被构造,所以从函数体中调用基础构造函数是没有意义的。

我的猜测是MSVC只是将其视为正常的函数调用?它不能构造基类,因为它已经被构造,所以我认为它将它视为“正常”函数调用。因此,虽然它不构造基类,但它可能具有进行初始化的效果......

另见What are the rules for calling the superclass constructor?