不是从构造函数调用虚函数和纯虚函数的重复:
以前的问题与 C++ 03 相关,而不是 C++ 11 中的新构造函数委托行为,并且该问题没有解决通过使用委托来减轻未定义行为的问题,以确保在执行纯虚拟实现之前正确构造。
在 C++ 11 中,在构造过程中,但在通过构造函数委托“完全构造”类/对象之后,在类的构造函数中调用纯虚函数有什么危险?
显然,在 C++ 11 规范中的某个地方存在这样的约束,
可以为正在构建的对象调用成员函数(包括虚拟成员函数,10.3)。同样,正在构建的对象可以是 typeid 运算符的操作数 .. - [C++ 工作草案] ( http://www.open-std.org/jtc1/sc22/wg21/docs/的 12.6.2 #13 paper/2011/n3242.pdf ) 找不到已发布规范的“合理使用”版本。
一旦任何构造函数完成执行,C++11 就会考虑构造一个对象。由于将允许执行多个构造函数,这意味着每个委托构造函数都将在其自己类型的完全构造的对象上执行。派生类构造函数将在其基类中的所有委托完成后执行。-维基百科说这是 C++ 11 的事情。
实际 C++ 11 参考未知。
以下示例在 Visual Studio 2012 C++ 编译器的 Nov CTP 中编译并运行:
#include <string>
/**************************************/
class Base
{
public:
int sum;
virtual int Do() = 0;
void Initialize()
{
Do();
}
Base()
{
}
};
/**************************************/
// Optionally declare class as "final" to avoid
// issues with further sub-derivations.
class Derived final : public Base
{
public:
virtual int Do() override final
{
sum = 0 ? 1 : sum;
return sum / 2 ; // .5 if not already set.
}
Derived(const std::string & test)
: Derived() // Ensure "this" object is constructed.
{
Initialize(); // Call Pure Virtual Method.
}
Derived()
: Base()
{
// Effectively Instantiating the Base Class.
// Then Instantiating This.
// The the target constructor completes.
}
};
/********************************************************************/
int main(int args, char* argv[])
{
Derived d;
return 0;
}