不是的复制从构造函数调用虚函数和纯虚函数 :
前一个问题涉及到C ++ 03,没有新的构造代表团行为C ++ 11,问题不使用代表团,以确保正确的施工执行纯虚函数的实现之前解决未定义行为的缓解。
在C ++ 11,什么是建设过程中一个类的构造函数调用纯虚函数,的危险,但是类/对象后,已通过构造代表团‘完全构造’?
显然,在C ++ 11规范这样的约束存在某处,
成员函数(包括虚拟成员函数,10.3)可被称为在建的对象。 类似地,在建的对象可以是typeid操作符的操作数。 - 12.6.2#的[C ++工作草案]的13( http://www.open-std.org/jtc1/sc22/wg21/docs/论文/ 2011 / n3242.pdf )找不到发布规格的“合理使用”的版本。
C ++ 11认为构造一旦对象的任何构造完成执行。 由于多个构造将被允许执行,这将意味着每个代表构造函数将其自己的类型的全构造的对象上执行。 派生类的构造函数将执行后,在其基类的所有代表团完成。 - 维基百科说,这是一个C ++ 11的事情。
实际C ++ 11参考未知的。
以下示例编译并运行在Visual Studio 2012 C ++编译器的十一月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;
}