Dans un cas simple (sans héritage multiple ni virtuel), les constructeurs sont appelés dans l’ordre.
Dans le cas Derived2 :
D’abord Base::Base() qui s’il appelle init ne peut appeler que Base::init (il ne peut avoir connaissance des autres, et la table des méthodes virtuel pointe pour l’instant sur sa fonction.
Ensuite Derived::Derived() qui s’il appelle init peut appeler soit la sienne Derived::init() soit celle de Base::init().
Ainsi de suite.
Si ton but est que chaque niveau de la hiérarchie appelle sa fonction d’init il n’y a pas de problème.
Une solution a ton problème pourrait-être d’utiliser une classe de callback sur destructeur.
classCallBack{public:CallBack(fct):my_fct(fct){}~CallBack(){my_fct(/* ancien this ? */);}modify(fct){my_fct=fct;}private:my_fct;};
Je n’ai pas défini le type de fct. On doit pouvoir utiliser std::bind pour inclure le this dans l’appel.
Ensuite, tu crées ton constructeur un peu comme ça :
Le dernier appelé sera celui de plus haut niveau (le dernier exécuté). L’objet temporaire créé pour le passage de paramètre sera détruit à la sortie du constructeur et donc, hors optimisation, le destructeur de l’objet callback devrait être appelé. (je n’ai pas le temps de tester mon idée...).
Je ne sais pas si ça résous ton problème, mais je rejoins le commentaire au dessus pour dire que ça semble être un soucis d’analyse du problème.
Par contre, la fonction que tu utilises ne peut être que statique. Ou alors, tu dois enregistrer un pointeur vers ton objet et dans ce cas faire : obj.fct()
# Ordre des constructeurs
Posté par Anthony Jaguenaud . En réponse au message Le constructeur d'une classe de base peut-il savoir qu'il n'est pas le dernier?. Évalué à 3. Dernière modification le 10 juillet 2017 à 12:40.
Dans un cas simple (sans héritage multiple ni virtuel), les constructeurs sont appelés dans l’ordre.
Dans le cas Derived2 :
D’abord Base::Base() qui s’il appelle init ne peut appeler que Base::init (il ne peut avoir connaissance des autres, et la table des méthodes virtuel pointe pour l’instant sur sa fonction.
Ensuite Derived::Derived() qui s’il appelle init peut appeler soit la sienne Derived::init() soit celle de Base::init().
Ainsi de suite.
Si ton but est que chaque niveau de la hiérarchie appelle sa fonction d’init il n’y a pas de problème.
Une solution a ton problème pourrait-être d’utiliser une classe de callback sur destructeur.
Je n’ai pas défini le type de fct. On doit pouvoir utiliser
std::bindpour inclure le this dans l’appel.Ensuite, tu crées ton constructeur un peu comme ça :
Le dernier appelé sera celui de plus haut niveau (le dernier exécuté). L’objet temporaire créé pour le passage de paramètre sera détruit à la sortie du constructeur et donc, hors optimisation, le destructeur de l’objet callback devrait être appelé. (je n’ai pas le temps de tester mon idée...).
Je ne sais pas si ça résous ton problème, mais je rejoins le commentaire au dessus pour dire que ça semble être un soucis d’analyse du problème.
Par contre, la fonction que tu utilises ne peut être que statique. Ou alors, tu dois enregistrer un pointeur vers ton objet et dans ce cas faire :
obj.fct()