IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Héritage initialisation membre const


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut Héritage initialisation membre const
    Bonjour,

    Je suis confronté à un petit problème pour l'initialisation d'un membre const avec une fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <map>
    #include <string>
    #include <iostream>
     
    using namespace std ;
     
    class Toto
    {
    	const map<string,string> s_map;
     
    protected:
    	virtual const map<string,string> init()
    	{
    		map<string,string> ret ;
    		ret["h1"] = "value1" ;
    		return ret ;
    	}
    public:
    	Toto() : s_map( init() ) {}
    	~Toto() {}
    	inline const map<string,string>& getMap() { return s_map; }
    };
     
    class SuperToto : public Toto
    {
    protected:
    	virtual const map<string,string> init()
    	{
    		map<string,string> ret = Toto::init();
    		ret["h2"] = "value2" ;
    		return ret ;
    	}
     
    public:
    	SuperToto() {}
    };
     
    int main()
    {
    	SuperToto toto ;
    	map<string,string>::const_iterator it = toto.getMap().find("h2");
    	if ( it != toto.getMap().end() )
    		cout << (*it).second << endl ;
    	else
    		cout << "Not found" << endl ;
    }
    Ma question est pourquoi la fonction SuperToto::init() n'est pas appeler automatiquement? Merci d'avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    Tu ne peux pas appeler une méthode de l'objet dans la liste d'initialisation ! Une solution est de passer la méthode en statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Toto
    {
    	const map<string,string> s_map;
     
    protected:
    	static map<string,string> init()
    	{
    		map<string,string> ret ;
    		ret["h1"] = "value1" ;
    		return ret ;
    	}
    public:
      Toto() : s_map( init() ) {}
    	~Toto() {}
    	inline const map<string,string>& getMap() { return s_map; }
    };

  3. #3
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Euh, en fait mon exemple compile et fonctionne (VS2008) mais c'est la surcharge de la fonction init qui n'est pas appeler, je ne pense pas que l’utilisation d'une déclaration static résolve mon problème.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    Pendant la construction (ou du destruction) d'un objet, la fonction virtuelle appelée est celle du type du constructeur/destructeur en cours d'exécution et non du type final de l'objet en cours de construction/destruction. Pour une fonction virtuelle pure, le comportement dans la classe abstraite est indéterminée.

    Cf Quand est construit le type dynamique ou quel est l'impact des appels de fonctions virtuelles dans un constructeur ?

Discussions similaires

  1. Classe avec membres const dans un vecteur
    Par PilloBuenaGente dans le forum Langage
    Réponses: 17
    Dernier message: 18/04/2013, 14h27
  2. précisions sur les fonctions membres const
    Par deubelte dans le forum Débuter
    Réponses: 3
    Dernier message: 07/03/2012, 00h08
  3. fonction membre const
    Par salseropom dans le forum C++
    Réponses: 10
    Dernier message: 21/10/2010, 19h06
  4. Initialisation de membres static const
    Par NiamorH dans le forum C++
    Réponses: 16
    Dernier message: 14/01/2008, 16h50
  5. Initialisation membre statique
    Par vandamme dans le forum C++
    Réponses: 6
    Dernier message: 06/07/2007, 20h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo