Базовый класс еще не создан, но я могу использовать _id?
Нет, вы не используете _id
, потому что нет объекта_id
пока.Но есть необработанная память объекта, и вы можете получить к ней доступ, используя идентификатор, интерпретируя необработанную память как объект int
.
Выполнение вызывает Неопределенное поведение , и вам лучше этого не делать.Неопределенное поведение может привести к тому, что ваш HD будет отформатирован, вы забеременеете или программа, похоже, будет работать нормально и делать то, что должна.И вы никогда не знаете, какой это, так как он может отличаться для каждого компилятора, версии компилятора, фазы луны или чего-то еще.
В вышеприведенном случае, интерпретируя необработанную память как объект int
, общий результат состоит в том, что любая битовая комбинация, существующая в этой позиции, интерпретируется как целое число, и результат используется.Однако платформы также могут перехватывать доступ к неинициализированной памяти и выдавать аппаратное исключение.
Если _id
не является POD (std::string
), вероятным, но не гарантированным результатом будет нарушение доступа.
Изменить в ответ на комментарий:
Вы можете получить доступ к элементам базового класса, даже неинициализированным, в списке инициализации производного класса простоштраф:
#include <iostream>
class Base{
public:
Base(int val):id_(val){};
protected:
int id_;
};
class Derived : Base {
public:
Derived(int val):Base(id_+val), blah_(id_) {};
int blah() const {return blah_;}
private:
int blah_;
};
int main(){
Derived d(60);
std::cout << d.blah() << '\n';
return 0;
}