une fonction virtuelle pure est celle qui est déclarée comme ceci:
class Foo {
virtual void bar() = 0;
};
bar
est un élément virtuel pur de Foo
. Il n'a pas d'implémentation (donc = 0
), et ne peut pas être appelé. Toute classe qui hérite de Foo
doit fournir une implémentation pour bar
. C'est la seule différence: la classe parente n'a pas d'implémentation pour le virtuel pur, donc les classes dérivées doivent le fournir. (Il existe une exception à cela, mais il est rarement utilisé.)
Sinon, cela fonctionne exactement de la même manière. Étant donné:
class Baz : public Foo {
virtual void bar() {}
};
Toute instance de Baz
est accessible avec un pointeur de type Foo*
et Baz::bar
sera appelée. Si Foo::bar
est purement virtuel, alors Foo
ne peut pas être instancié et les appels au Foo::bar
seront des erreurs. Si Foo::bar
est pas pur, puis la mise en œuvre prévue Foo::bar
sera appelé pour les instances de Foo
et Baz::bar
seront appelés pour les instances de Baz
, même si elle est à travers un Foo*
.
(virtuals pures peuvent aussi avoir des mises en œuvre de telle sorte que, par exemple, Baz::bar
peut appeler Foo::bar
, mais cela est rare.)