我已将问题简化为以下代码:
#include<iostream>
#include<stdio.h>
#include <list>
using namespace std;
class B
{
public:
B(){
cout<<"Default ctor of B"<<endl;
};
};
class C
{
public:
C()
{
cout<<"Default ctor of C"<<endl;
}
void sayHello()
{
cout<<"Say hello"<<endl;
}
};
class A: public B
{
public:
void fun()
{
c.sayHello();
}
private:
C c;
};
int main(int argc, char** argv)
{
A* a=new A();
a->fun();
delete a;
return 0;
}
当我创建 A 的对象时,我可以看到 C 的默认构造函数没有被调用,但是当我调用 A::fun() 时,它会正确调用 C::sayHello()。这怎么可能?我在特定的工具链下交叉编译它,但仍然如何分配对象内存而不调用它的默认 ctor 主体?这似乎是明显的编译器错误,不是吗?
当我在 Fedora 上使用 GCC 编译上述代码时,一切都按预期工作......
编辑:编译器是为 Broadcom 芯片组量身定制的 GCC-4.2。执行代码时,嵌入式系统存在问题。解决它的方法是将默认的空构造函数添加到 A:
A(){}
即使没有在其初始化列表上显式调用 C 成员的默认构造函数。