调用基类构造函数时隐含的"this"

Implicit 'this' when calling base class' constructor

本文关键字:this 基类 构造函数 调用      更新时间:2023-10-16

我希望下面的片段能解释一切:

struct TBase {
  virtual void f() {}
};
struct TDerived : public TBase {
    TDerived() {
      /* These are all fine either under GCC 4.4.3, ICC 12 and Comeau online: */
      f();
      this->f();
      TBase::f();
      this->TBase::f();
      /* This one fails under Comeau: */
      TBase::TBase();
      /* While this one fails in every case: */
      //this->TBase::TBase();
      /* e.g. GCC says:
         test.cpp: In constructor ‘TDerived::TDerived()’:
         test.cpp:17: error: invalid use of ‘struct TBase’  */
    }
    void f() {}
};

问题是:为什么?(即,根据Comeau C++,为什么TBase::TBase()是错误的?为什么this->TBase::TBase()更错误?)

因为您不能直接调用任何构造函数(§12.1(2)ISO/IEC 14882:2003(E))。如果你想调用基类构造函数,你必须在初始化器列表中这样做,即:

TDerived() : TBase() {
}

其主要原因是,当控件到达派生构造函数的第一个可执行代码行时,可以保证基类对象已经完全构造完成(§12.6.2(5)和(6)ISO/IEC 14882:2003(E))。由于构造函数通常用于资源获取(即RAII),如果允许它"双重"构造对象,那将是一个错误。