Surcharge d'opérateur & héritage A part l'opérateur d'assignation, les opérateurs sont automatiquement hérités dans une classe dérivée. Ceci peut se démontrer en héritant de C12:Byte.h: //: C14:OperatorInheritance.cpp // Hériter des opérateurs surchargés #include "../C12/Byte.h" #include <fstream> using namespace std; ofstream out("ByteTest.out"); class Byte2 : public Byte { public: // Les constructeurs ne s'héritent pas : Byte2(unsigned char bb = 0) : Byte(bb) {} // opérateur = ne s'hérite pas, mais // est fabriqué pour les assignations liées aux membres. // Toutefois, seul l'opérateur SameType = SameType // est fabriqué, et vous devez donc // fabriquer les autres explicitement : Byte2& operator=(const Byte& right) { Byte::operator=(right); return *this; } Byte2& operator=(int i) { Byte::operator=(i); return *this; } }; // Fonction test similaire à celle contenue dans C12:ByteTest.cpp: void k(Byte2& b1, Byte2& b2) { b1 = b1 * b2 + b2 % b1; #define TRY2(OP) \ out << "b1 = "; b1.print(out); \ out << ", b2 = "; b2.print(out); \ out << "; b1 " #OP " b2 produces "; \ (b1 OP b2).print(out); \ out << endl; b1 = 9; b2 = 47; TRY2(+) TRY2(-) TRY2(*) TRY2(/) TRY2(%) TRY2(^) TRY2(&) TRY2(|) TRY2(<<) TRY2(>>) TRY2(+=) TRY2(-=) TRY2(*=) TRY2(/=) TRY2(%=) TRY2(^=) TRY2(&=) TRY2(|=) TRY2(>>=) TRY2(<<=) TRY2(=) // Assignment operator // Instructions conditionnelles : #define TRYC2(OP) \ out << "b1 = "; b1.print(out); \ out << ", b2 = "; b2.print(out); \ out << "; b1 " #OP " b2 produces "; \ out << (b1 OP b2); \ out << endl; b1 = 9; b2 = 47; TRYC2(<) TRYC2(>) TRYC2(==) TRYC2(!=) TRYC2(<=) TRYC2(>=) TRYC2(&&) TRYC2(||) // Assignation en chaîne : Byte2 b3 = 92; b1 = b2 = b3; } int main() { out << "member functions:" << endl; Byte2 b1(47), b2(9); k(b1, b2); } ///:~ Le code test est identique à celui utilisé dans C12:ByteTest.cpp sauf que Byte2 est utilisé à la place de Byte. De cette façon, on vérifie que tous les opérateurs fonctionnent avec Byte2 via l'héritage. Quand vous examinez la classe Byte2, vous constatez que le constructeur doit être explicitement défini, et que, seul, operator= qui assigne un Byte2 à un Byte2 est fabriqué ; tout autre opérateur d'assignation dont vous avez besoin devra être fabriqué par vos soins.