Disons que j'ai une classe de base abstraite avec un virtuel pur qui retourne un objet coûteux. Comme c'est un objet cher, je devrais retourner une référence à celui-ci.C++ Covariance et références
Mais la vie n'est pas si simple, disons que j'en ai deux classes: on a la fonction appelée souvent, il est donc plus efficace de stocker une copie dans l'instance et de renvoyer une référence. L'autre est rarement appelé, il est donc préférable de créer l'objet à la demande pour sauvegarder la RAM.
Je pensais que je pouvais utiliser covariance parce que le principe de substitution Liskov serait heureux, mais bien sûr Obj
n'est pas un sous-type de Obj&
, donc compilent entraînent des erreurs.
class abc
{
public:
virtual BigObj& obj() = 0;
};
class derived : public abc
{
public:
...
virtual BigObj obj() { return obj_; }
private:
BigObj obj_;
};
Résultats dans:
conflicting return type specified for ‘virtual BigObj derived::obj()’
Y at-il une solution plus élégante à ce que tout simplement choisir le moins pire?
La réponse simple est * vous ne voulez pas faire cela *. Vous pouvez * penser * que vous le voulez, mais vous ne voulez pas vraiment le faire. La modification de la sémantique de renvoi d'une valeur ou d'une référence est trop importante pour être * masquée * du code utilisateur. –