Pourquoi utiliser de la classe de base des pointeurs pour les classes dérivées
class base{
.....
virtual void function1();
virtual void function2();
};
class derived::public base{
int function1();
int function2();
};
int main()
{
derived d;
base *b = &d;
int k = b->function1() //Why use this instead of the following line?
int k = d.function1(); //With this, the need for virtual functions is gone, right?
}
Je ne suis pas une fac d'informatique ingénieur et je voudrais savoir ce. Pourquoi utiliser des fonctions virtuelles, si on peut éviter de la classe de base des pointeurs?
Vous devez vous connecter pour publier un commentaire.
La puissance de polymorphisme n'est pas vraiment évident dans votre exemple simple, mais si vous étendre un peu, il pourrait devenir plus claire.
Cela vous permet d'itérer sur une liste de pointeurs et des méthodes différentes pour obtenir appelée en fonction du type sous-jacent. Fondamentalement, il vous permet d'écrire du code où vous n'avez pas besoin de savoir ce que l'enfant est de type au moment de la compilation, mais le code exercer le droit de la fonction, de toute façon.
Vous avez raison, si vous avez un objet que vous n'avez pas besoin de consulter, par l'intermédiaire d'un pointeur. Vous pouvez aussi ne pas besoin d'un destructeur virtuel lorsque l'objet sera détruit que le type il a été créé.
L'utilitaire est quand vous obtenez un pointeur vers un objet à partir d'un autre morceau de code, et vous ne savez pas vraiment ce que la plupart des dérivés de type est. Vous pouvez avoir deux ou plus de deux types dérivés construits sur la même base, et ont une fonction qui retourne un pointeur vers le type de base. Fonctions virtuelles vous permettront d'utiliser le pointeur de la sans se soucier de qui type dérivé que vous utilisez, jusqu'à ce qu'il est temps de détruire l'objet. Le destructeur virtuel va détruire l'objet, sans le savoir, qui classe dérivée correspond à.
Voici l'exemple le plus simple de l'utilisation de fonctions virtuelles:
son pour mettre en œuvre le polymorphisme. Sauf si vous avez de la classe de base pointeur
en pointant l'objet dérivé que vous ne peut pas avoir le polymorphisme ici.
alors qu'une tentative d'invoquer la fonction eval() avec l'adresse d'un objet n'est pas dérivée à partir d'une Requête
résultats dans une erreur de compilation:
Vous semblez avoir posé deux questions (dans le titre et à la fin):
Pourquoi utiliser de la classe de base des pointeurs pour les classes dérivées?
C'est l'utilisation du polymorphisme. Il vous permet de traiter des objets de manière uniforme tout en vous permettant d'avoir de mise en œuvre spécifiques. Si cela vous ennuie, alors je suppose que vous devez vous demander: Pourquoi le polymorphisme?
Pourquoi utiliser virtual destructeurs si on peut éviter de la classe de base des pointeurs?
Le problème ici est vous ne pouvez pas toujours éviter de la classe de base des pointeurs à exploiter la force de polymorphisme.