调用基类构造函数时隐含的"this"
Implicit 'this' when calling base class' constructor
我希望下面的片段能解释一切:
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),如果允许它"双重"构造对象,那将是一个错误。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 使用 'this' 作为指向 CRTP 基类中派生类的指针
- 对象的"this"指针是否等于指向其(单个)基类的指针?
- 当基类不是多态但派生时,"this"地址不匹配是
- C++,pthread和静态回调。 "this" 返回一个指针,指向派生的基类(第 2 部分)
- 为什么"this"在为派生类对象调用时无法访问基类方法中的派生类成员
- 调用基类构造函数时隐含的"this"
- 在基类构造函数中使用“this”有效吗
- 为什么static_cast(*this)到基类会创建一个临时副本
- 解析公用派生基类模板中的函数模板名称时出错"Not declared in this scope"
- 是否有一种方法来绕过必须前缀模板基类成员与' this '
- c++:为什么可以编译?(处理this-Reference到基类)
- 允许"this->"访问依赖基类成员的规则是什么?
- 对于C++基类来说,存储"this"的值以供构造后的未来虚拟调用安全吗?
- 在模板派生类中,为什么需要使用成员函数中的"this->"限定基类成员名称?
- 多态性返回派生的"this",从C++中的基类
- 将基类模板的“this”类型转换为其派生类
- 当您具有虚拟析构函数时,基类指针中的"delete this"是否会删除派生类对象?