我希望以下片段解释一切:
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() {}
};
Run Code Online (Sandbox Code Playgroud)
问题是:为什么?(即为什么是TBase::TBase()错的,根据Comeau C++?为什么this->TBase::TBase()甚至是wronger?)
因为你不能直接调用任何构造函数(§12.1(2)ISO/IEC 14882:2003(E)).如果要调用基类构造函数,则必须在初始化列表中执行此操作,即:
TDerived() : TBase() {
}
Run Code Online (Sandbox Code Playgroud)
这样做的主要原因是,当时间控制到达派生构造函数的第一个可执行代码行时,可以保证基类对象已经完全构造(§12.6.2(5)和(6)ISO/IEC 14882 :2003(E)).由于构造函数通常用于资源获取(即RAII),如果允许"双重"构造对象,则会出错.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |