C++代码中Derived d1()构造调用类型及cout输出为1的疑问
问题1:声明Derived d1()时实际调用了哪种类型的构造函数?
这行代码没有生成任何Derived类实例,也没有调用任何构造函数。你遇到的是C++中著名的**最令人头疼的解析(most vexing parse)**规则:当一行代码既可以被解释为变量定义,也可以被解释为函数声明时,编译器会优先将其解析为函数声明。
此处Derived d1()会被解析为:声明一个名为d1的函数,该函数无入参,返回值为Derived类型。
问题2:为什么cout<<d1的输出结果为1?
上文已经说明d1是函数名,函数名在输出上下文里会自动隐式转换为对应的函数指针。由于C++标准库没有为普通函数指针实现operator<<的重载,编译器会进一步将函数指针隐式转换为bool类型:非空的函数指针转换为bool后值为true,默认输出格式下true会被转为整数1输出。
如果在输出前添加cout << boolalpha;,你会看到输出结果变为true。
问题3:生成的Derived实例是否包含基类的int a成员?
这个问题的前提不成立:你的代码里没有生成任何Derived类实例。
如果修改代码避免函数声明歧义、且成功实例化Derived对象的话:Derived类公有继承Base类,会包含Base类的所有非静态成员,自然也包括public的int a成员。但需要注意你当前代码里Base的默认构造函数是private权限,派生类的默认构造函数无法调用基类的私有构造函数,如果真的尝试实例化Derived对象会直接编译报错。
如果要验证实例逻辑,可以修改两处代码:
- 将Base的构造函数权限改为public,或者将Derived声明为Base的友元
- 将
Derived d1();改为Derived d1;,避免函数声明歧义
内容的提问来源于stack exchange,提问作者hacker_panda
相关产品推荐
相关产品推荐

