Не дубликат Вызов виртуальной функции и чисто виртуальной функции из конструктора:
Бывший вопрос относится к С++ 03, а не к поведению Делитера конструктора в С++ 11, и этот вопрос не рассматривает смягчение поведения undefined, используя делегирование, чтобы обеспечить правильное построение до того, как будут выполнены чистые виртуальные реализации.
В С++ 11, каковы опасности вызова функций Pure Virtual в конструкторе класса во время построения, но после того, как класс/объект был "полностью построен" через делегирование конструктора?
По-видимому, где-то в спецификации С++ 11 такое ограничение существует,
Функции-члены (включая виртуальные функции-члены, 10.3) могут быть призвал к строительству объекта. Аналогичным образом, объект, конструкцией может быть операнд оператора типа. - 12.6.2 # 13 [С++ Working Draft] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) Не удается найти версию "Справедливого использования" опубликованной спецификации.
С++ 11 рассматривает объект, построенный после завершения любого конструктора выполнение. Поскольку несколько конструкторов будут разрешены для выполнения, это будет означать, что каждый конструктор делегата будет выполняться на полностью построенный объект своего типа. Производные конструкторы классов будет выполняться после завершения делегирования в базовых классах. - Wikipedia, говоря, что это вещь С++ 11.
Фактический С++ 11 Ссылка неизвестна.
Следующий пример компиляции и RUNS в Nov CTP Visual Studio 2012 Компилятор С++:
#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;
}