Le paragraphe ci-dessous a été extrait de la page 420 du livre de Stroustup "The C++ Programming Language" (troisième édition) :
Parce qu'un pointeur vers un membre virtuel (s dans cet exemple) est une sorte de décalage, il ne dépend pas de l'emplacement d'un objet en mémoire. A pointeur vers un membre virtuel peut donc être transmis en toute sécurité entre différents espaces d'adressage, tant que la même disposition d'objet est utilisée en les deux. Comme les pointeurs vers les fonctions ordinaires, les pointeurs vers les fonctions membres non virtuelles ne peuvent pas être échangés entre les espaces d'adressage. ne peuvent pas être échangés entre espaces d'adressage.
Je conteste la dernière phrase de ce paragraphe. Ci-dessous, vous trouverez un extrait de code où les pointeurs sur non virtuelle les fonctions des membres, foo()
y foo1()
sont échangés entre un objet de base a
et un objet dérivé b
sans problème.
Ce qui ne peut pas être fait, c'est la surcharge de n'importe quelle fonction de la base, foo()
o foo1()
dans la classe dérivée, car dans ce cas, le compilateur émettra une erreur comme indiqué ci-dessous.
#include <iostream>
class A
{
int i;
public:
A() : i(1) {}
void foo() { std::cout << i << '\n'; }
void foo1() { std::cout << 2 * i << '\n'; }
};
class B: public A
{
int j;
public:
B() : A(), j(2) {}
// void foo() { std::cout << j << '\n'; }
};
int main()
{
typedef void (A::* PMF)();
PMF p = &B::foo; // error C2374: 'p' redefinition, multiple initialization
// if foo() is overloaded in B.
PMF q = &B::foo1;
B b;
(b.*p)();
(b.*q)();
A a;
(a.*p)();
(a.*q)();
}