コンストラクターからの呼び出し仮想関数と純粋仮想関数の重複ではありません:
以前の質問は、C++ 11 の新しいコンストラクター委任の動作ではなく、C++ 03 に関連しており、純粋な仮想実装が実行される前に、委任を使用して適切な構築を保証することにより、未定義の動作の軽減に対処していません。
C++ 11 では、構築中にクラスのコンストラクターで Pure Virtual 関数を呼び出すことの危険性は何ですか?
どうやら、C++ 11 仕様のどこかにそのような制約が存在し、
メンバー関数 (仮想メンバー関数、10.3 を含む) は、構築中のオブジェクトに対して呼び出すことができます。同様に、構築中のオブジェクトは typeid 演算子のオペランドになることができます.. papers/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;
}