8Q SHWLW WRXU GX &
                                  'LGLHU 'RQVH]

                                   ,679  89+

                           GRQVH]#XQLYYDOHQFLHQQHVIU




Didier DONSEZ 1995-1998          Un petit tour du C++             1

                                http://krimo666.mylivepage.com/
RPELQDLVRQ GH IRQFWLRQQDOLWpV
ODQJDJH 
      - Performances
           SURJUDPPDWLRQ VVWqPH



ODQJDJH $'$
      Concept de Généricité et de Modularité

      Surcharge

ODQJDJH 22
      Héritage Statique (simple et multiple)

      Spécialisation - Généralisation - Abstraction
           6PDOOWDON 2EM/LVS (LIIHO 2EMHFWLYH -DYD« HW ELHQ V€U 


Didier DONSEZ 1995-1998              Un petit tour du C++                   2

                                     http://krimo666.mylivepage.com/
OD VQWD[H GH EDVH  OH ODQJDJH 

VQWD[WH FODVVLTXH
      type de base
               (char, int, long, float, double, unsigned ....)

      type constructeur
               (array [], struct, union)

      opérateurs, expressions, blocs, structures de contrôle
              (if, switch, while, for )

      fonctions
                  (bibliothéque d'entrée/sortie)




Didier DONSEZ 1995-1998                 Un petit tour du C++              3

                                        http://krimo666.mylivepage.com/
([WHQVLRQ GX ODQJDJH 
      référence 
           QRPPDJH PXOWLSOH G
XQ REMHW
   int a;
   int abis = a;

           VLPSOLILFDWLRQ G
pFULWXUH SRXU SDUDPrWUHV SDU YDULDEOH
   int   inc_ptr(int* i) { return ++(*i); }
   int   b,c;
   c =   inc_ptr(b);
   int   inc_ref(int i) { return ++i; }
   c =   inc_ref(b) ;

      surcharge de fonctions
   void print( int ) { ... };
   void print( double ) { ... };
   void print( char* ) { ... };

      fonction inline
   inline int increment(int a) { return ++a; }
   #define INCREMENT(A) (++(A))

Didier DONSEZ 1995-1998            Un petit tour du C++             4

                                  http://krimo666.mylivepage.com/
$SSRUW GH ODQJDJH 22 
                            OHV FODVVHV G
REMHWV
      encapsulation des membres, manipulation au travers des méthodes.
   class Entreprise {
       // membres
     int nbEmployes
     Employe* listePersonnel[MAX_Pers];
   public:
       // constructeur/destructeur
     Entreprise();
     Entreprise(Entreprise*);
     ˜Entreprise();
   private:
       // méthodes
     void embauche(Employe*, int sal=SAL_SMIC)
     void debauche(Employe*);
     void debauche(Employe*, int primeDepart); //surcharge
   public:
       // méthodes d'opérateur
     Entreprise operator += (Employe* e)
     inline Entreprise operator -= (Employe* e)
                        { debauche(e); return *this; }
   }

Didier DONSEZ 1995-1998           Un petit tour du C++                   5

                                  http://krimo666.mylivepage.com/
'pFODUDWLRQV ,PEULTXpHV
   class List {
     class Element { public: ...
       give(Obj o);
     };
   public:
     insert(Obj o);
   };
   class List {
     class Element { public: ...
       alloc(Obj o);
     };
   public:
     insert(Obj o);
   };
   Array::Element::give(Obj o) { ... }
   List::Element::alloc(Obj o) { ... }

   class Process { public:
      enum Status { IDLE, RUNNING };
       Status st;
       ...
   };
   schedule() {
       Process::Status st = IDLE;
       ...
   }

Didier DONSEZ 1995-1998            Un petit tour du C++              6

                                   http://krimo666.mylivepage.com/
$SSRUW GH ODQJDJH 22 
                          PDQLSXODWLRQ GHV REMHWV
   main() {
   Entreprise IBM; // constructeur 1
   Entreprise* Bell = new Entreprise; // ex-malloc + constructeur 1
   Employe durant;
   Employe* p_durant = durant
   Employe martin;

   IBM.embauche(p_durant);
   IBM -= p_durant;
   Bell-embauche(p_durant);
   (Bell) += martin;

   Entreprise ATT(Bell); // constructeur 2
                          // instanciation au milieu du code
   delete Bell; // desallocateur + destructeur
   ATT -= p_durant; //
   } // en sortie de bloc
     // destructeur ˜Entreprise() pour IBM, ATT
     // destructeur ˜Employe() pour durant, martin



Didier DONSEZ 1995-1998          Un petit tour du C++                 7

                                 http://krimo666.mylivepage.com/
RQVWUXFWHXUV 'HVWUXFWHXU
RQVWUXFWHXUV 0ODVV
MyClass() est généré par défaut mais il peut être surchargé

      Il est invoqué lors de la déclaration des variables locales (et paramêtres) et par
        l'opérateur MyClass::new()

      NB : MyClass(MyClass) peut être invoqué lors d'une affectation

'HVWUXFWHXU a0ODVV
généré par défaut mais il peut être surchargé une seule fois

      Il est invoqué sur les variables locales (et paramêtres) à la sortie d'un bloc (ou de la
        fonction) et par l'opérateur MyClass::delete()




Didier DONSEZ 1995-1998               Un petit tour du C++                            8

                                      http://krimo666.mylivepage.com/
$OORFDWHXU 'pVDOORFDWHXU
$OORFDWHXU RSHUDWRU 0ODVVQHZ
généré par défaut mais il peut être surchargé

$OORFDWHXU RSHUDWRU QHZ
l'opérateur ::new() est l'allocateur globale
      il existe par défaut mais il peut être surchargé

'pVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
généré par défaut mais il peut être surchargé

'pVDOORFDWHXU RSHUDWRU GHOHWH
l'opérateur ::delete() est l'allocateur globale

      il existe par défaut mais il peut être surchargé




Didier DONSEZ 1995-1998                Un petit tour du C++              9

                                       http://krimo666.mylivepage.com/
RQVWUXFWHXUV 'HVWUXFWHXU
      $OORFDWHXU 'pVDOORFDWHXU ([HPSOH
class Str { public:
     char* cs;
     Str()         { cs=(char*)NIL; };
     Str(char* cs) {
       this-cs=new char[strlen(cs)+1]; strcpy(this-cs,cs);};
     Str(const Str s){
       if(this-cs!=(char*)NIL) delete this-cs;
       this-cs=new char[strlen(s.cs)+1]; strcpy(this-cs,cs.s);};
     ~Str()        { if(this-cs!=(char*)NIL) delete this-cs; };
   };

   Str func(Str p){        // Str::Str(const Str) pour p
     Str v1;                // Str::Str() pour v1
     ...
     {
        Str v2(v1);         // Str::Str(const Str) pour v2
        Str v3 = v2;        // Str::Str(const Str) pour v3
       ...
     }                      // Str::~Str pour v3, v2
     ...
   }                        // Str::~Str pour v1, p
   int main(){    Str m1(toto);    // Str::Str(char*) pour m1
                  Str m2 = func(m1); // Str::Str(const Str) pour m2
   }

Didier DONSEZ 1995-1998           Un petit tour du C++                 10

                                  http://krimo666.mylivepage.com/
2SpUDWHXUV
      Définition des Opérateurs
          PpWKRGHV DSSHOpHV DYHF XQH IRUPH VQWD[LTXH DOJpEULTXH
   class Obj;
   class ListObj { public: ...
                 ListObj();
                 ListObj(const ListObj);
      ListObj   operator =(const ListObj);
      ListObj   operator +=(const ListObj);
      ListObj   operator +=(const Obj);
      const Obj operator [](long);
   };

   ListObj operator + (const ListObj, const ListObj );

      Utilisation des Opérateurs
   ListObj l2, l3;
   ListObj   l1(l3); //     ListObj(const ListObj);
                   // vs ListObj();l1.operator=(l3);
   l1 += l2;    // l1.operator+=( l2 )
   l1 += l3[0];    // l1.operator+=( l3.operator[](0) )
   l1 = l2 + l3; // l1.operator=( operator+(l2,l3) );

Didier DONSEZ 1995-1998            Un petit tour du C++              12

                                   http://krimo666.mylivepage.com/
+pULWDJHV 6LPSOH HW 0XOWLSOH
                      OHV RQVWUXFWHXUV
class Person { public:
        char* nom;
     Person(char* nom) {
        this-nom = new char[strlen(nom)+1];
        strcpy(this-nom, nom);
    };
   }
class Etudiant : public Person { public:
        char* etude;
     Etudiant (char* nom, char* etu) : Person(nom) {
        etude = new char[strlen(nom)+1];
        strcpy( etude, etu);
     };
   }
class Employe : public Person { public:
        int echelon;
     Employe(char* nom, int ech) : Person(nom), echelon(ech) {};
   }
class Etudiant_en_FormCont: public Etudiant, virtual public Employe {
    public:
     Etudiant_en_FormCont(char* nom, char* etu, int ech)
        : Etudiant(nom,etu), Employe(nom, ech) {};
   }


Didier DONSEZ 1995-1998          Un petit tour du C++                   13

                                 http://krimo666.mylivepage.com/
0pWKRGHV 9LUWXHOOHV
                          0pWKRGHV QRQ 9LUWXHOOHV
   class Person { public:
       char* nom;
       virtual    printVIRT() { cout  nom;};
                  print()     { cout  nom;};
   };
   class Employe : public Person { public:
       int echelon;
       virtual printVIRT() { Person::printVIRT(); cout  echelon; };
               print()      { Person::print();      cout  echelon; };
               print2()         { Employe::print(); };
   };

   f(){
           Employe Bill;
           Employe e =  Bill;
           Person p = e;     // Person p =  Bill;

           e-printVIRT();   // Employe::printVIRT()
           e-print();          // Employe::print()
           e-print2();         // Employe::print2()
           p-printVIRT();   // Employe::printVIRT() (abstraction)
           p-print();          // Person::print()
           p-print2();         // Erreur de Compilation
   }

Didier DONSEZ 1995-1998             Un petit tour du C++                  14

                                   http://krimo666.mylivepage.com/
+pULWDJH 0XOWLSOH HW 0pWKRGHV
  class Person { public:
       char* nom;
     virtual print() { cout  nom;};
  }
class Employe : public Person { public:
       int echelon;
     virtual print() {            // spécialisation
             Person::print();
             cout  echelon;
   };
  }
class Etudiant : public Person { public:
       char* etude;
     virtual print() {            // spécialisation
             Person::print();
             cout  etude;
   };
  }
class Etudiant_en_FormCont: public Etudiant, virtual public Employe {
    public:
     virtual print() {      Etudiant::print();
                         Employe::print();
   };

Didier DONSEZ 1995-1998      Un petit tour du C++                 15

                             http://krimo666.mylivepage.com/
ODVVHV $EVWUDLWHV SXUH YLUWXDO
pas d’instanciation possible pour ces classes
   class Figure {         public:
      virtual void        draw()=0;
   };
   class Circle :         public Figure {
      virtual void        draw() { ... };
   };

   Figure fig;             // KO
   Circle circle;          // OK


           5HPDUTXH GpILQLWLRQ RSWLRQHOOH GH Figure::draw()




Didier DONSEZ 1995-1998               Un petit tour du C++              16

                                      http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,  'pILQLWLRQ
Private (défaut)
           VHXOHPHQW
            PpWKRGHV PHPEUHV
            LQLWLDOLVHXUV GH OD FODVVH
            PpWKRGHV IULHQG

      Protected
           HQ SOXV
            PpWKRGHV PHPEUHV G
XQH FODVVH GpULYpH

      Public
             WRXWHV PpWKRGHV RX IRQFWLRQV




Didier DONSEZ 1995-1998             Un petit tour du C++              17

                                    http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,,  8WLOLVDWLRQ
class Base {                              class Derive : public Base {
       private:                                    int   d();
         int    a;                               protected:
       protected:                                  int   e;
         int    b();                             public:
       public:                                     int   f;
         int    c;                            };
       private:
         int    g();
    };

Base::g() {               Derive::g() {                      f(Base bs, Derive
  a++; // OK                a++; // OK                       dr){
  b(); // OK                b(); // OK                         bs.a++; // Error
  c++; // OK                c++; // OK                         bs.b(); // Error
}                                                              bs.c++; // OK
                              d();   // OK
                              e++;   // OK                        dr.d();   // Error
                              f++;   // OK                        dr.e++;   // Error
                          }                                       dr.f++;   // OK
                                                             }




Didier DONSEZ 1995-1998          Un petit tour du C++                              18

                                http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,,,  +HULWDJH
class Base {                      class Derive                      class DD : Derive {
  private:   int          a;         : XXXXX Base {                   fDD(Derive);
  protected: int          b();                 int   d();           };
  public:    int          c;        protected int    e;
  private:   int          g();      public:    int   f;
};                                };
XXXXX = public                      XXXXX = protected                    XXXXX = private

DD::fDD(Derive dr){              DD::fDD(Derive dr){              DD::fDD(Derive dr){
  dr.a++; // Error                  dr.a++; // Error                  dr.a++; // Error
  dr.b(); // OK                     dr.b(); // OK                     dr.b(); // Error
  dr.c++; // OK                     dr.c++; // OK                     dr.c++; // Error
}                                 }                                 }
f(Derive dr){                    f(Derive dr){                    f(Derive dr){
  dr.a++; // Error                  dr.a++; // Error                  dr.a++; // Error
  dr.b(); // Error                  dr.b(); // Error                  dr.b(); // Error
  dr.c++; // OK                     dr.c++; // Error                  dr.c++; // Error
}                                 }                                 }

   la classe Derive rend public    la classe Derive rend public               la classe Derive
        le contrôle d'accès             le contrôle d'accès                 ne rend pas public
        de sa super-classe              de sa super-classe                  le contrôle d'accès
              à tous                        uniquement                      de sa super-classe
                                    à ses sous classes et aux
                                              friends
Didier DONSEZ 1995-1998                 Un petit tour du C++                                      19

                                       http://krimo666.mylivepage.com/

Tour C++

  • 1.
    8Q SHWLW WRXUGX & 'LGLHU 'RQVH] ,679 89+ GRQVH]#XQLYYDOHQFLHQQHVIU Didier DONSEZ 1995-1998 Un petit tour du C++ 1 http://krimo666.mylivepage.com/
  • 2.
    RPELQDLVRQ GH IRQFWLRQQDOLWpV ODQJDJH - Performances SURJUDPPDWLRQ VVWqPH ODQJDJH $'$ Concept de Généricité et de Modularité Surcharge ODQJDJH 22 Héritage Statique (simple et multiple) Spécialisation - Généralisation - Abstraction 6PDOOWDON 2EM/LVS (LIIHO 2EMHFWLYH -DYD« HW ELHQ V€U Didier DONSEZ 1995-1998 Un petit tour du C++ 2 http://krimo666.mylivepage.com/
  • 3.
    OD VQWD[H GHEDVH OH ODQJDJH VQWD[WH FODVVLTXH type de base (char, int, long, float, double, unsigned ....) type constructeur (array [], struct, union) opérateurs, expressions, blocs, structures de contrôle (if, switch, while, for ) fonctions (bibliothéque d'entrée/sortie) Didier DONSEZ 1995-1998 Un petit tour du C++ 3 http://krimo666.mylivepage.com/
  • 4.
    ([WHQVLRQ GX ODQJDJH référence QRPPDJH PXOWLSOH G XQ REMHW int a; int abis = a; VLPSOLILFDWLRQ G pFULWXUH SRXU SDUDPrWUHV SDU YDULDEOH int inc_ptr(int* i) { return ++(*i); } int b,c; c = inc_ptr(b); int inc_ref(int i) { return ++i; } c = inc_ref(b) ; surcharge de fonctions void print( int ) { ... }; void print( double ) { ... }; void print( char* ) { ... }; fonction inline inline int increment(int a) { return ++a; } #define INCREMENT(A) (++(A)) Didier DONSEZ 1995-1998 Un petit tour du C++ 4 http://krimo666.mylivepage.com/
  • 5.
    $SSRUW GH ODQJDJH22 OHV FODVVHV G REMHWV encapsulation des membres, manipulation au travers des méthodes. class Entreprise { // membres int nbEmployes Employe* listePersonnel[MAX_Pers]; public: // constructeur/destructeur Entreprise(); Entreprise(Entreprise*); ˜Entreprise(); private: // méthodes void embauche(Employe*, int sal=SAL_SMIC) void debauche(Employe*); void debauche(Employe*, int primeDepart); //surcharge public: // méthodes d'opérateur Entreprise operator += (Employe* e) inline Entreprise operator -= (Employe* e) { debauche(e); return *this; } } Didier DONSEZ 1995-1998 Un petit tour du C++ 5 http://krimo666.mylivepage.com/
  • 6.
    'pFODUDWLRQV ,PEULTXpHV class List { class Element { public: ... give(Obj o); }; public: insert(Obj o); }; class List { class Element { public: ... alloc(Obj o); }; public: insert(Obj o); }; Array::Element::give(Obj o) { ... } List::Element::alloc(Obj o) { ... } class Process { public: enum Status { IDLE, RUNNING }; Status st; ... }; schedule() { Process::Status st = IDLE; ... } Didier DONSEZ 1995-1998 Un petit tour du C++ 6 http://krimo666.mylivepage.com/
  • 7.
    $SSRUW GH ODQJDJH22 PDQLSXODWLRQ GHV REMHWV main() { Entreprise IBM; // constructeur 1 Entreprise* Bell = new Entreprise; // ex-malloc + constructeur 1 Employe durant; Employe* p_durant = durant Employe martin; IBM.embauche(p_durant); IBM -= p_durant; Bell-embauche(p_durant); (Bell) += martin; Entreprise ATT(Bell); // constructeur 2 // instanciation au milieu du code delete Bell; // desallocateur + destructeur ATT -= p_durant; // } // en sortie de bloc // destructeur ˜Entreprise() pour IBM, ATT // destructeur ˜Employe() pour durant, martin Didier DONSEZ 1995-1998 Un petit tour du C++ 7 http://krimo666.mylivepage.com/
  • 8.
  • 9.
    MyClass() est générépar défaut mais il peut être surchargé Il est invoqué lors de la déclaration des variables locales (et paramêtres) et par l'opérateur MyClass::new() NB : MyClass(MyClass) peut être invoqué lors d'une affectation 'HVWUXFWHXU a0ODVV
  • 10.
    généré par défautmais il peut être surchargé une seule fois Il est invoqué sur les variables locales (et paramêtres) à la sortie d'un bloc (ou de la fonction) et par l'opérateur MyClass::delete() Didier DONSEZ 1995-1998 Un petit tour du C++ 8 http://krimo666.mylivepage.com/
  • 11.
  • 12.
    généré par défautmais il peut être surchargé $OORFDWHXU RSHUDWRU QHZ
  • 13.
    l'opérateur ::new() estl'allocateur globale il existe par défaut mais il peut être surchargé 'pVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
  • 14.
    généré par défautmais il peut être surchargé 'pVDOORFDWHXU RSHUDWRU GHOHWH
  • 15.
    l'opérateur ::delete() estl'allocateur globale il existe par défaut mais il peut être surchargé Didier DONSEZ 1995-1998 Un petit tour du C++ 9 http://krimo666.mylivepage.com/
  • 16.
    RQVWUXFWHXUV 'HVWUXFWHXU $OORFDWHXU 'pVDOORFDWHXU ([HPSOH
  • 17.
    class Str {public: char* cs; Str() { cs=(char*)NIL; }; Str(char* cs) { this-cs=new char[strlen(cs)+1]; strcpy(this-cs,cs);}; Str(const Str s){ if(this-cs!=(char*)NIL) delete this-cs; this-cs=new char[strlen(s.cs)+1]; strcpy(this-cs,cs.s);}; ~Str() { if(this-cs!=(char*)NIL) delete this-cs; }; }; Str func(Str p){ // Str::Str(const Str) pour p Str v1; // Str::Str() pour v1 ... { Str v2(v1); // Str::Str(const Str) pour v2 Str v3 = v2; // Str::Str(const Str) pour v3 ... } // Str::~Str pour v3, v2 ... } // Str::~Str pour v1, p int main(){ Str m1(toto); // Str::Str(char*) pour m1 Str m2 = func(m1); // Str::Str(const Str) pour m2 } Didier DONSEZ 1995-1998 Un petit tour du C++ 10 http://krimo666.mylivepage.com/
  • 18.
    2SpUDWHXUV Définition des Opérateurs PpWKRGHV DSSHOpHV DYHF XQH IRUPH VQWD[LTXH DOJpEULTXH class Obj; class ListObj { public: ... ListObj(); ListObj(const ListObj); ListObj operator =(const ListObj); ListObj operator +=(const ListObj); ListObj operator +=(const Obj); const Obj operator [](long); }; ListObj operator + (const ListObj, const ListObj ); Utilisation des Opérateurs ListObj l2, l3; ListObj l1(l3); // ListObj(const ListObj); // vs ListObj();l1.operator=(l3); l1 += l2; // l1.operator+=( l2 ) l1 += l3[0]; // l1.operator+=( l3.operator[](0) ) l1 = l2 + l3; // l1.operator=( operator+(l2,l3) ); Didier DONSEZ 1995-1998 Un petit tour du C++ 12 http://krimo666.mylivepage.com/
  • 19.
    +pULWDJHV 6LPSOH HW0XOWLSOH OHV RQVWUXFWHXUV
  • 20.
    class Person {public: char* nom; Person(char* nom) { this-nom = new char[strlen(nom)+1]; strcpy(this-nom, nom); }; } class Etudiant : public Person { public: char* etude; Etudiant (char* nom, char* etu) : Person(nom) { etude = new char[strlen(nom)+1]; strcpy( etude, etu); }; } class Employe : public Person { public: int echelon; Employe(char* nom, int ech) : Person(nom), echelon(ech) {}; } class Etudiant_en_FormCont: public Etudiant, virtual public Employe { public: Etudiant_en_FormCont(char* nom, char* etu, int ech) : Etudiant(nom,etu), Employe(nom, ech) {}; } Didier DONSEZ 1995-1998 Un petit tour du C++ 13 http://krimo666.mylivepage.com/
  • 21.
    0pWKRGHV 9LUWXHOOHV 0pWKRGHV QRQ 9LUWXHOOHV class Person { public: char* nom; virtual printVIRT() { cout nom;}; print() { cout nom;}; }; class Employe : public Person { public: int echelon; virtual printVIRT() { Person::printVIRT(); cout echelon; }; print() { Person::print(); cout echelon; }; print2() { Employe::print(); }; }; f(){ Employe Bill; Employe e = Bill; Person p = e; // Person p = Bill; e-printVIRT(); // Employe::printVIRT() e-print(); // Employe::print() e-print2(); // Employe::print2() p-printVIRT(); // Employe::printVIRT() (abstraction) p-print(); // Person::print() p-print2(); // Erreur de Compilation } Didier DONSEZ 1995-1998 Un petit tour du C++ 14 http://krimo666.mylivepage.com/
  • 22.
    +pULWDJH 0XOWLSOH HW0pWKRGHV class Person { public: char* nom; virtual print() { cout nom;}; } class Employe : public Person { public: int echelon; virtual print() { // spécialisation Person::print(); cout echelon; }; } class Etudiant : public Person { public: char* etude; virtual print() { // spécialisation Person::print(); cout etude; }; } class Etudiant_en_FormCont: public Etudiant, virtual public Employe { public: virtual print() { Etudiant::print(); Employe::print(); }; Didier DONSEZ 1995-1998 Un petit tour du C++ 15 http://krimo666.mylivepage.com/
  • 23.
  • 24.
    pas d’instanciation possiblepour ces classes class Figure { public: virtual void draw()=0; }; class Circle : public Figure { virtual void draw() { ... }; }; Figure fig; // KO Circle circle; // OK 5HPDUTXH GpILQLWLRQ RSWLRQHOOH GH Figure::draw() Didier DONSEZ 1995-1998 Un petit tour du C++ 16 http://krimo666.mylivepage.com/
  • 25.
    RQWU{OH G $FFHV , 'pILQLWLRQ
  • 26.
    Private (défaut) VHXOHPHQW PpWKRGHV PHPEUHV LQLWLDOLVHXUV GH OD FODVVH PpWKRGHV IULHQG Protected HQ SOXV PpWKRGHV PHPEUHV G XQH FODVVH GpULYpH Public WRXWHV PpWKRGHV RX IRQFWLRQV Didier DONSEZ 1995-1998 Un petit tour du C++ 17 http://krimo666.mylivepage.com/
  • 27.
    RQWU{OH G $FFHV ,, 8WLOLVDWLRQ
  • 28.
    class Base { class Derive : public Base { private: int d(); int a; protected: protected: int e; int b(); public: public: int f; int c; }; private: int g(); }; Base::g() { Derive::g() { f(Base bs, Derive a++; // OK a++; // OK dr){ b(); // OK b(); // OK bs.a++; // Error c++; // OK c++; // OK bs.b(); // Error } bs.c++; // OK d(); // OK e++; // OK dr.d(); // Error f++; // OK dr.e++; // Error } dr.f++; // OK } Didier DONSEZ 1995-1998 Un petit tour du C++ 18 http://krimo666.mylivepage.com/
  • 29.
  • 30.
    class Base { class Derive class DD : Derive { private: int a; : XXXXX Base { fDD(Derive); protected: int b(); int d(); }; public: int c; protected int e; private: int g(); public: int f; }; }; XXXXX = public XXXXX = protected XXXXX = private DD::fDD(Derive dr){ DD::fDD(Derive dr){ DD::fDD(Derive dr){ dr.a++; // Error dr.a++; // Error dr.a++; // Error dr.b(); // OK dr.b(); // OK dr.b(); // Error dr.c++; // OK dr.c++; // OK dr.c++; // Error } } } f(Derive dr){ f(Derive dr){ f(Derive dr){ dr.a++; // Error dr.a++; // Error dr.a++; // Error dr.b(); // Error dr.b(); // Error dr.b(); // Error dr.c++; // OK dr.c++; // Error dr.c++; // Error } } } la classe Derive rend public la classe Derive rend public la classe Derive le contrôle d'accès le contrôle d'accès ne rend pas public de sa super-classe de sa super-classe le contrôle d'accès à tous uniquement de sa super-classe à ses sous classes et aux friends Didier DONSEZ 1995-1998 Un petit tour du C++ 19 http://krimo666.mylivepage.com/