Création d'instances de classe dérivées à partir de pointeurs de classe de base polymorphes
En programmation orientée objet, il est souvent nécessaire de copier ou de créer des instances de classes dérivées classes allant des pointeurs aux classes de base polymorphes. Cependant, cette opération peut être difficile lorsque plusieurs types dérivés existent.
L'approche naïve consistant à utiliser plusieurs typeids ou Dynamic_casts dans les instructions if pour vérifier chaque type, puis à utiliser new est inefficace et sujette aux erreurs. Une meilleure solution consiste à utiliser une méthode virtuelle dans la classe de base pour créer une copie.
Méthode Virtual clone()
En définissant un clone( ) dans la classe de base et en l'implémentant dans chaque classe dérivée, il est possible de créer dynamiquement une copie de l'instance de classe dérivée. La méthode clone() doit renvoyer un pointeur vers la copie nouvellement créée.
1 2 3 4 5 |
|
1 2 3 4 5 6 |
|
1 2 3 4 5 6 |
|
En utilisant cette approche, vous pouvez créer une copie d'une instance de classe dérivée à partir d'un pointeur de classe de base comme suit :
1 2 |
|
Idiome CRTP pour une implémentation minimaliste
Pour éviter de dupliquer le code d'implémentation du clone() dans chaque classe dérivée, vous pouvez utiliser l'idiome CRTP (Curiously Recurring Template Pattern) :
1 2 3 4 5 6 7 |
|
1 2 3 |
|
1 2 3 |
|
Cette approche implémente automatiquement la méthode clone() dans chaque classe dérivée tout en garantissant que le constructeur de copie est appelé pour le type correct.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!