﻿# V1099\. Using the function of uninitialized derived class while initializing the base class will lead to undefined behavior\.

Анализатор обнаружил использование нестатической функции\-члена производного класса при инициализации базового класса\. Согласно стандарту, такой код приводит к неопределённому поведению\.

Рассмотрим пример:

```cpp
struct Base
{
  Base(int);
};

struct Derived : public Base
{
  int FuncFromDerived();
  Derived() : Base(FuncFromDerived()) {}   // <=
};
```

Конструктор структуры 'Derived' вызывает конструктор базового класса 'Base' в списке инициализации\. При этом, в качестве аргумента конструктора передаётся результат функции 'FuncFromDerived', которая принадлежит производной структуре\. При создании объекта типа 'Derived' инициализация будет произведена в следующем [порядке](https://timsong-cpp.github.io/cppwp/n4861/class.base.init#13):

1. Вызов функции 'Derived::FuncFromDerived\(\)';
1. Вызов конструктора 'Base';
1. Вызов конструктора 'Derived'\.

В результате произойдёт вызов функции у структуры, которая не была инициализирована, что нарушает [правило стандарта](https://timsong-cpp.github.io/cppwp/n4861/class.base.init#16):

> Member functions \(including virtual member functions, \[class\.virtual\]\) can be called for an object under construction\.
>
> Similarly, an object under construction can be the operand of the typeid operator \(\[expr\.typeid\]\) or of a dynamic\_cast \(\[expr\.dynamic\.cast\]\)\.
>
> **However, if these operations are performed in a ctor\-initializer \(or in a function called directly or indirectly from a ctor\-initializer\) before all the mem\-initializers for base classes have completed, the program has undefined behavior\.**