Polymorphisme compliqué

rajaspera Messages postés 1 Date d'inscription vendredi 2 avril 2010 Statut Membre Dernière intervention 19 mai 2011 - 19 mai 2011 à 12:04
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 19 mai 2011 à 13:24
Bonjour,

j'ai un problème qui me bloque depuis 48 heures, j'ai décidé de finalement vous soumettre la question :

pour la figure suivante :

mes classes :
/* virtual */class WeightKernel
{
public:
WeightKernel();
virtual ~WeightKernel() { } ;
virtual void init(int)=0;

//virtual void initializeWeight(void) =0;
};

class Convolutional : public WeightKernel
{
int _kernelNumero ;
int _predecessorMapNumber;
.....

public:
Convolutional();
~Convolutional();
void init(int);
.......
};

déclaration dans le main :
WeightKernel* kernelTable ;

mon problème se situe au niveau de l'instanciation :

......
kernelTable = new Convolutional[6] ; // 6 par ex

for ( int i = 0 ; i < 6 ; i++ )
kernelTable[i].init(i);

le fait est que kernelTable[i] n'accède pas aux méthodes de la classe Convolutional mais uniquement celles de la classe abstraite de départ. (je veux bien car j'ai pas casté dynamiquement). En scrutant les rapport d'erreurs, le vftable n'occure que pour kerneltable[0]. Là se situe ma question comment se fait il que le vftable est appelé uniquement pour la première boucle autrement dit, la boucle marche pour l'unique première itération mais pas pour les autres. Pourquoi ?

dans l'attente de vos réponse, je vous en remercie d'avance !

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 mai 2011 à 13:24
Évite les new ...[], préfère un std::list ou un std::vector.

#include 
#include <list>

class WeightKernel
{
public:
  WeightKernel() {}
  virtual ~WeightKernel() { }
  virtual void init(int) = 0;
};

class Convolutional : public WeightKernel
{
  int _kernelNumero ;
  int _predecessorMapNumber;
public:
  Convolutional() {}
  ~Convolutional() {}
  void init(int) { std::cout << "conv" << std::endl; }

};

int main()
{
  std::list<WeightKernel*> kernelTable;
  for (int i = 0; i < 6 ; ++i)
    kernelTable.push_back(new Convolutional);


  int i = 0;
  for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
       it != kernelTable.end(); ++it)
  {
    (*it)->init(i);
    ++i;
  }

  for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
       it != kernelTable.end(); ++it)
    delete *it;

  return 0;
}



Y a un truc bizarre quand même dans ton code:
Tu fais rentrer un tableau fixe dans un simple pointeur... Or le polymorphisme, pour fonctionner correctement doit connaître sa base. Il te faut donc le faire de manière dynamique, avec un tableau contenant des pointeurs (**) et non un pointeur sur un tableau (*), sinon forcément seul le premier fonctionne...

#include 

class WeightKernel
{
public:
  WeightKernel() {}
  virtual ~WeightKernel() { }
  virtual void init(int) = 0;
};

class Convolutional : public WeightKernel
{
  int _kernelNumero ;
  int _predecessorMapNumber;
public:
  Convolutional() {}
  ~Convolutional() {}
  void init(int) { std::cout << "conv" << std::endl; }

};

int main()
{
  WeightKernel** kernelTable = new WeightKernel*[6];

  for (int i = 0; i < 6 ; ++i)
    kernelTable[i] = new Convolutional;

  for (int i = 0; i < 6 ; ++i)
    kernelTable[i]->init(i);

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous