2011-05-23 6 views
0

Comment hériteront opérateur surchargée +()?opérateur Héritant +()

Par exemple, j'ai deux classes:

class Bin : public Number<2, 256> 
{ 
public: 
    Bin(const char* number = NULL) : 
     Number(number) 
    {} 
}; 

et

template <unsigned int BASE, unsigned int ORDER> 
class Number 
{ 
private: 
    ... 

public: 
    Number(const char* number = NULL) { 
     ... 
    } 

    const Number& operator +=(const Number& number) { 
     ... 
    } 

    Number operator +(const Number& number) const { 
     Number result = *this; 
     return result += number; 
    } 
}; 

opérateur +() retourne le nombre. Mais je veux faire:

Bin firstNum("101010111010"); 
Bin secondNum("1101011101"); 
Bin result = firstNum + secondNum; 

Type de (firstNum + secondNum) - Nombre < 2, 256> non Bin. Dois-je surcharger +() dans chaque héritier?

+0

Notez que ce problème n'est pas spécifique à l'opérateur '' +, ou même les opérateurs en général. C'est aussi vrai pour les fonctions membres "normales" ... –

Répondre

0

ne peut se faire, les opérateurs ne peuvent pas être rendus virtuels (i.e.. Héritées du passé). PAS directement au moins.

Vous pouvez le faire:

class Base { 
public: 
    Base operator+(const Base& addend) { return addOp(addend) ; } 
private: 
    virtual Base addOp(const Base& addend) ; 
} ; 

puis passer outre ADDOP au contenu de votre cœur. Cependant, vous devez vous assurer que tout ce qui hérite peut renvoyer une 'base' qui fonctionnera avec n'importe quoi d'autre. Cela devient assez compliqué assez rapidement.

+0

Cela pourrait être légèrement déroutant, lorsque l'ajout de deux classes dérivées aboutit à un 'Base'. –

1

Tenir compte ce qui devrait se produire dans un exemple un peu plus compliqué que le vôtre, où la classe dérivée Bin a ses propres variables membres. Comment la fonction de classe de base pourrait-elle savoir quoi faire pour créer la valeur de retour? Et que ferait-il dans les ajouts "mixtes"? (par exemple si un argument était un Bin, et l'autre était un Blah).

Alors oui, vous aurez besoin de définir des opérateurs spécifiques partout que vous voulez un comportement spécifique. Notez que ceci est vrai non seulement des opérateurs surchargés, mais des fonctions membres en général.

+0

Si je veux définir son propre opérateur d'ajout pour chaque classe dérivée, je dois copier le code. Comment résoudre ce problème plus clair? – Dmitry

+1

Beaucoup de bonne documentation. Pour être plus clair, comme Oli disait, que se passe-t-il si vous faites ceci: définir une classe Hex, puis ajouter Bin plus Hex? Le nombre ne sait rien sur les deux classes, donc vous devez décider quoi faire dans la classe dérivée: retournez-vous un Bin? un sortilège? Jetez une erreur? Vous pouvez toujours envelopper et utiliser l'implémentation dans Number, mais en fin de compte, vous aurez besoin de code dans les classes dérivées pour résoudre ce genre de problème. – Matt

1

Il serait probablement plus facile de reproduire simplement la mise en œuvre de operator+ dans toutes les classes dérivées. Cependant, si vous vous sentez aventureux, vous pouvez utiliser le curiously recurring template pattern pour appliquer la cohérence de type dans votre classe de modèle Number.