Можно ли в C++ передавать в конструктор предка указатель на другого уже сконструированного предка?
Я не могу найти ответ на следующий вопрос.
Рассмотрим следующий код:
class A
{
// ...
}
class B
{
public:
B(A* _a) : a{ _a } {}
private:
A *a;
};
class C : private A, public B
{
public:
C() : B{ this } {}
};
Скажите, пожалуйста, является ли этот код корректным?
Я предполагаю, что да. При передаче в конструктор B (C::B) указателя this, он (указатель) автоматически (статически) преобразуется к указателю на A (C::A). А поскольку подобъект A (C::A) уже сконструирован, проблем возникнуть не должно.
PS. Описанный выше код был придуман, чтобы решить следующую проблему:
class C : public B
{
public:
C() : B{ &a } {}// UB
private:
A a;
};
Судя по всему, такой код имеет неопределенное поведение из-за того, что в конструктор C::B() передается адрес объекта, который еще не существует. Да, память под него уже выделена (хотя, это может зависеть от реализации), но объекта еще нет.
Таким образом, иногда при компиляции получается неработающий код.