1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
   | #include <iostream>
using namespace std;
class Base
{
    public:
        virtual Base& Fonction1(/*...*/);
        virtual Base& Fonction2(/*...*/);
        virtual Base& Fonction3(/*...*/);
};
class Derivee1 : public Base
{
    public:
        virtual Derivee1& Fonction1(/*...*/);
        virtual Derivee1& Fonction2(/*...*/);
        virtual Derivee1& Fonction3(/*...*/);
};
class Derivee2 : public Base
{
    public:
        virtual Derivee2& Fonction1(/*...*/);
        virtual Derivee2& Fonction2(/*...*/);
        virtual Derivee2& Fonction3(/*...*/);
};
Base& Base::Fonction1()
{
    cout<<"Base::fonction1"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Base
                   */
}
Base& Base::Fonction2()
{
    cout<< "Base::fonction 2"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Base
                   */
}
Base& Base::Fonction3()
{
    cout<<"Base::fonction3"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Base
                   */
}
Derivee1& Derivee1::Fonction1()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction1();
     */
    cout<<"Derivee1::fonction1"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Derivee1
                   */
}
Derivee1& Derivee1::Fonction2()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction2();
     */
    cout<< "Derivee1::fonction 2"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Derivee1
                   */
}
Derivee1& Derivee1::Fonction3()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction3();
     */
    cout<<"Derivee1::fonction3"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Derivee1
                   */
}
Derivee2& Derivee2::Fonction1()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction1();
     */
    cout<<"Derivee2::fonction1"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Derivee2
                   */
}
Derivee2& Derivee2::Fonction2()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction2();
     */
    cout<< "Derivee2::fonction 2"<<endl;
    return *this; /* renvoie une référence sur l'objet courent, qui est
                   * du type Derivee2
                   */
}
Derivee2& Derivee2::Fonction3()
{
    /* aurait pu faire appel explicitement à la méthode adaptée à un type 
     * Base:
    Base::Fonction3();
     */
    cout<<"Derivee2::fonction3"<<endl;
    return *this;
}
/**********************************************/
int main()
{
    cout<<"Creation et utilisation d'un objet de type Derive1"<<endl;
    Derivee1 d1;
    d1.Fonction1()
      .Fonction2()
      .Fonction3();
    cout<<"faisons passer cet objet comme etant du type de base "
        <<"et recommencons"<<endl;
    Base& b = d1;
    b.Fonction1()
     .Fonction2()
     .Fonction3();
} | 
Partager