我正在交叉编译从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);
{
}
为什么呢?
答案 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?