3 votes

La réaffectation d'une fonction virtuelle est-elle légale ?

Supposons que j'aie une classe comme celle-ci :

struct A{
  virtual void someFunc() { }
};

Est-il possible de réaffecter la fonction virtuelle à une autre fonction ? ....Cela pourrait être possible parce qu'il stocke un pointeur de fonction dans la classe afin qu'il puisse être réaffecté à une autre fonction. virtual .

Je me rends compte que quelque chose comme ça :

void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;

C'est probablement impossible parce que les fonctions membres prennent un this comme paramètre implicite.

Mais est-il possible de réaffecter une fonction membre à une autre fonction membre ?

10voto

Brian Points 15388

Non, il n'y a pas de circonstances dans lesquelles une fonction peut être réaffectée.

Vous pouvez toutefois réaffecter un pointeur de fonction, mais l'utilité de cette opération dépend de ce que vous essayez réellement de faire. https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

3voto

Ben Points 4733

Non, il n'est pas possible de réattribuer une fonction.

Vous pouvez faire deux choses pour obtenir un comportement différent de la fonction :

  1. Utiliser un pointeur de fonction.
  2. Hériter de cette classe et surcharger la fonction.

Il est probable qu'aucun de ces moyens ne constitue une solution élégante au problème que vous rencontrez.


Voici un exemple de pointeur de fonction :

struct A{
  virtual void (*pSomeFunc)(void);
};

...

A a;
a.pSomeFunc = &aRandomFunc;
a.pSomeFunc();

Un exemple d'héritage pourrait être le suivant :

struct AWithDifferentFuncAbility : public A {
    virtual void someFunc() {
       //some new functionality;
    }
}

0voto

Guillaume Racicot Points 1106

Vous devriez essayer std::function Il fait quelque chose de proche de ce dont vous avez besoin.

Voici comment vous pouvez le faire avec cette classe :

struct A{
  std::function<void()> someFunc = []{ /* default implementation */ };
};

Vous pouvez ensuite modifier la fonction en question :

void aRandomFunc();
A mya;
mya.someFunc = &aRandomFunc;

Ou même le remplacer par un autre lambda :

mya.someFunc = []{ /* another function */ };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X