| 12
 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