【问题标题】:Need help understanding the output需要帮助理解输出
【发布时间】:2021-10-23 00:02:13
【问题描述】:

我有以下代码

#include <iostream>
using namespace std;

class Base {
    private:
        Base() {
            cout<<"Base ctor has been called "<<endl;
        };
    public:
        int a;
};

class Derived: public Base {

};

int main() {
    Base* b1;
    Derived d1();
    cout<<d1;
    return 0;
}

我不确定在上面的示例中如何创建派生类对象 d1。代码编译并运行没有任何错误。创建 Derived d1(); 时调用了哪种类型的构造函数?为什么cout&lt;&lt;d1; 的输出为 1? Derived 的实例是否有基类的int a?感谢大家的帮助!

【问题讨论】:

  • Derived d1();d1 声明为一个函数,不接受任何参数并返回一个Derived 对象。
  • @Someprogrammerdude 啊我明白了!听起来不错。为什么 cout 部分的输出为 1?
  • 这有点复杂,但所有函数都被认为是“真实的”,这意味着它是operator&lt;&lt;bool 重载,它使用true 值调用。除非设置了boolalpha 标志,否则它将打印为1

标签: c++ inheritance


【解决方案1】:

在您的main 函数中,Derived d1(); 实际上是一个名为d1 的函数的声明,它不接受任何参数并返回一个Derived。至于为什么打印1std::ostream 没有Derived (*)() 的重载(d1 被隐式转换为),因此它将其转换为唯一合适的类型,即bool。尝试将cout&lt;&lt;d1; 替换为cout &lt;&lt; boolalpha &lt;&lt; d1;,您会看到程序打印出true

【讨论】:

  • The most vexing parse 有点不同,它发生在(相信的)构造函数参数被视为函数声明参数时。
  • @Someprogrammerdude 所以最麻烦的解析只适用于声明有参数的情况? (作为旁注,我在发布测试之前运行了这个,编译器确实给出了-Wvexing-parse 警告,这对我来说证实了我的假设)
  • 对于编译器来说,这可能属于同一警告类别,但并不是真正的烦恼。不像例如Class1 obj_but_really_fun(Class2(foo));
  • @Someprogrammerdude 删除了第一句话,谢谢。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多