C ++ 11 Delegated Constructor Método Virtual Puro e Chamadas de Função - Perigos?

Não é uma duplicata deChamando função virtual e função virtual pura de um construtor:

A antiga questão refere-se ao C ++ 03, não ao novo comportamento de Delegação de Construtor em C ++ 11, e a questão não aborda a mitigação do comportamento indefinido usando delegação para garantir uma construção adequada antes que as implementações virtuais puras sejam executadas.

Em C ++ 11, quais são os perigos de invocar funções Pure Virtual em um construtor de classe, durante a construção, mas depois que a classe / objeto foi "totalmente construída" via delegação de construtor?

Aparentemente, em algum lugar na especificação C ++ 11 tal restrição existe,

Funções de membro (incluindo funções de membro virtuais, 10.3) podem ser chamadas para um objeto em construção. Da mesma forma, um objeto em construção pode ser o operando do operador typeid .. - 12.6.2 # 13 do [C ++ Working Draft] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) Não é possível encontrar a versão "Fair Use" da especificação publicada.

O C ++ 11 considera um objeto construído quando qualquer construtor finaliza a execução. Como vários construtores poderão ser executados, isso significará que cada construtor delegado estará executando em um objeto totalmente construído de seu próprio tipo. Os construtores de classe derivados serão executados após a conclusão de toda a delegação em suas classes base. -Wikipedia dizendo que isso é uma coisa C ++ 11.

Real C ++ 11 Referência desconhecida.

Seguinte exemplo compila e executa em Nov CTP do Visual Studio 2012 compilador C ++:

#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;
}

questionAnswers(2)

yourAnswerToTheQuestion