Par copiable, tu entends par l'opérateur d'affectation ou par le constructeur de copie? Ça m'est déja arrivé de faire des fonctions virtual Base * clone(const Base ) = 0; qui sont explicitées dans les classes filles en appelant le constructeur de copie par un new(this), et ça ne m'avait pas choqué.
Les deux. L’usage d’une fonction clone est problématique aussi (qu’est censé faire Derived::clone(Base const& b) si on lui donne un Base& qui est de type Derived2 ? Un assert ? pas terrible...).
Copier la partie Base d’un Derived un autre Base peut avoir du sens, en revanche, copier dans un Derived une partie Base en a beaucoup moins. Et je ne sais pas autoriser l’un sans autoriser l’autre.
Il y a des cas où on en arrive à faire ça (une hiérarchie de classes copiables), mais en général par soucis de simplificité (comprendre, flemme :) ) et c’est source de problèmes. Ce n’est pas quelque chose de conceptuellement très correct.
Tu veux dire de définir une struct connue de ta classe seule qui contiendrait tous les membres copiables de la classe, ce qui permettrait de pouvoir copier tous les membres d'un coup? Ça ne fonctionne que si tu n'as pas une hiérarchie qui ajoute des membres, autrement c'est presque pire.
Ce n’est pas du tout à ça que je pensais. Je ne vois pas trop comment faire un exemple simple, mais l’idée, c’est plutôt de passer par un mécanisme de copie non-standard (appel de fonction statique, pex) pour se prémunir d’un usage imprévu / susceptible de poser des problèmes (à la place d’une copie implicite potentiellement problématique, tu as une erreur de compilation, c’est beaucoup mieux).
Mes commentaires sont en wtfpl. Une licence sur les commentaires, sérieux ? o_0
[^] # Re: Donc pour résumer...
Posté par whity . En réponse à la dépêche C++17, Genèse d’une version mineure. Évalué à 2.
Les deux. L’usage d’une fonction clone est problématique aussi (qu’est censé faire Derived::clone(Base const& b) si on lui donne un Base& qui est de type Derived2 ? Un assert ? pas terrible...).
Copier la partie Base d’un Derived un autre Base peut avoir du sens, en revanche, copier dans un Derived une partie Base en a beaucoup moins. Et je ne sais pas autoriser l’un sans autoriser l’autre.
Il y a des cas où on en arrive à faire ça (une hiérarchie de classes copiables), mais en général par soucis de simplificité (comprendre, flemme :) ) et c’est source de problèmes. Ce n’est pas quelque chose de conceptuellement très correct.
Ce n’est pas du tout à ça que je pensais. Je ne vois pas trop comment faire un exemple simple, mais l’idée, c’est plutôt de passer par un mécanisme de copie non-standard (appel de fonction statique, pex) pour se prémunir d’un usage imprévu / susceptible de poser des problèmes (à la place d’une copie implicite potentiellement problématique, tu as une erreur de compilation, c’est beaucoup mieux).
Mes commentaires sont en wtfpl. Une licence sur les commentaires, sérieux ? o_0