begin process at 2012 05 29 05:08:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

Fonction virtuelle en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fonction virtuelle en C

mardi 8 décembre 2009 à 19:48:35 | Fonction virtuelle en C

cogno

Bonjour les amis,

ma question est la suivante:

Comment simuler une fonction virtuelle en C ?

Merci
mardi 8 décembre 2009 à 22:20:20 | Re : Fonction virtuelle en C

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Par fonction virtuelle on entends redéfinir une méthode dans une classe fille.
Pour simuler cela, tu te fais une structure qui comporte des pointeurs sur fonction et des éléments "normaux"(ce qu'on appelle une vtable "pour virtual table", que le C++ gère automatiquement).
Esuite, tu fais une deuxième structure qui possède au moins les mêmes éléments, en plus d'avoir des vtables.
Lrosque tu castes, si tu as bien fait les choses, mêmes en utilisant une classe mère, ça appellera bien une méthode de la classe enfant.

C'est très dur à expliquer, voici un exemple, simplifié pour illustrer mes dires:
Code C/C++ :
#include <stdio.h>
#include <stdlib.h>

typedef void (*VirtualFunctionPointer)(void*);

typedef struct
{
  VirtualFunctionPointer pFunc;
} VTable;

struct Mother;
struct Daughter;

typedef struct
{
  VTable* pVTable;
  int i;
  float f;
} Mother;

typedef struct
{
  VTable* pVTable;
  int i;
  float f;
  char c;
} Daughter;

void mother_kikoo(void* this)
{
  printf("Mother: Kikoo %p\n", this);
}

void mother_display(void* this)
{
  Mother* _this = this;
  printf("Mother: %i %f\n", _this->i, _this->f);
}

void daughter_display(void* this)
{
  Daughter* _this = this;
  mother_display((Mother*)this);
  printf("Daughter: %i %f %c\n", _this->i, _this->f, _this->c);
}

VTable VTableArrayForMother[] =
  {
    { (VirtualFunctionPointer) mother_display },
    { (VirtualFunctionPointer) mother_kikoo }
  };

VTable VTableArrayForDaughter[] =
  {
    { (VirtualFunctionPointer) daughter_display },
    { (VirtualFunctionPointer) mother_kikoo }
  };

Mother* new_Mother(void)
{
  Mother* this = NULL;
  this = (Mother*) malloc(1 * sizeof (Mother));
  this->pVTable = VTableArrayForMother;
  return this;
}

Daughter* new_Daughter(void)
{
  Daughter* this = NULL;
  this = (Daughter*) malloc(1 * sizeof (Daughter));
  this->pVTable = VTableArrayForDaughter;
  return this;
}

int main(void)
{
  Mother* klass = new_Mother();
  Mother* klass2 = (Mother*) new_Daughter();

  klass->i = 7;
  klass->f = 34.5;
  (klass->pVTable[0].pFunc)(klass);
  (klass->pVTable[1].pFunc)(klass);
  free(klass);

  printf("\n\n");

  klass2->i = 89;
  klass2->f = 103.34;
  (klass2->pVTable[0].pFunc)(klass2);
  (klass2->pVTable[1].pFunc)(klass2);
  free(klass2);

  return 0;
}
mardi 8 décembre 2009 à 22:42:04 | Re : Fonction virtuelle en C

cogno

Réponse acceptée !
J'vais méditer ce code.. :)


Cette discussion est classée dans : fonction, virtuelle


Répondre à ce message

Sujets en rapport avec ce message

Suprimmer un fichier [ par naney ] tout d'abort un grand merci au webmaster de ce site :D car j'en avais mare de cherche un site comme vbfranc.com mais qui parler du c et du c++Je cherc attendre que le shell soit fini C++ [ par McK_N ] Salut,je veux appeler la fonction Shell et je veux que mon programe arrête jusqu'à ce que le shell soit terminé.Comment puis-je le faire avec la fonct prob avec une dll [ par BlackWizzard ] Salut!je voudrais faire une dll avec un niveau tres bas...j'ai deja créé une dll de cryptage en me basant sur un code simple...la chose que je compren Existe t il une fonction équivalente à mid right ou left ( du VB) en cpp ? [ par Stoomm ] Existe t il une fonction équivalente à mid right ou left ( du VB) en cpp ? Merci d'avance et A+. Stoomm. [?] Saisie d'une fonction [ par Cidrik ] Salut,Je débute en C et j'aimerais créer un programme qui réalise une étude de fonction (niveau 1°S) mais j'aimerais savoir comment faire pour que qua la fonction c++ StrToNum : [ par sounlight ] A quoi sert la fonction StrToNum ()?Est-elle déjà définie dans les bibliothèques c++par défaut?Qu'elle est sa syntaxe ?Je suis débutant développeur c+ randomize sous VC++ 6.0 non defini?? comment faire?? [ par petitivnnie ] En effet je n'ai troué aucune occurence des les headers fournis dans la version 6.0 de visual C++J'aimerai que l'on m'indique comment implenter cette Fonction $gettok (mIRC) sous cpp [ par mast ] Salut j'aui une variable qui retourne par exemple: allo sa va oui toi? /echo -a allo /echo -a bye et je voudrais enregistrer les 2 commen (/..) dans c net use * /delete EN C++ [ par LeBobo ] Salut. J'ai un petit programme qui utilise la fonction : system(''net use * /delete'') ; Le problème est que mon programme à une interface graphique w Exemple de EnumPrinters (qui fonctionne) en C++ [ par nico ] Je voudrais que mon programme puisse détecter l'imprimante par défaut utilisée par mon PC. Pour ce faire j'ai trouvé la fonction "EnumPrinters". Le pr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales