La classe de base n'est toujours pas construite mais je suis capable d'utiliser '_id'?
Non, vous ne l'utilisez _id
, parce qu'il n'y a pas un objet _id
encore. Mais il y a la mémoire brute de l'objet, et vous pouvez y accéder en utilisant l'identifiant, en interprétant la mémoire brute comme un objet int
.
invoque Faire de comportement non défini et vous feriez mieux de ne pas le faire. Un comportement non défini peut conduire à ce que votre HD soit formatée, que vous tombiez enceinte ou que le programme fonctionne correctement et fasse ce qu'il est censé faire. Et vous ne savez jamais lequel c'est, car il pourrait être différent avec chaque compilateur, version du compilateur, phase de lune, ou autre.
Dans le cas ci-dessus, l'interprétation de la mémoire brute en tant qu'objet int
a pour résultat commun que tout modèle binaire existant à cette position est interprété comme un entier et que le résultat est utilisé. Cependant, les plates-formes pourraient tout aussi bien intercepter l'accès à la mémoire non initialisée et lancer une exception matérielle.
Si _id
était un non-POD (std::string
), un résultat probable, mais non garanti, constituerait une violation d'accès.
Modifier en réponse à un commentaire:
Vous pouvez accéder aux membres de la classe de base, même non initialisées, dans une liste d'initialisation classe dérivée très bien:
#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;
}
Je ne comprends pas que vous ne pouvez pas comprendre la question – stijn