ݺߣ

ݺߣShare a Scribd company logo
Удамшлын хэрэгцээ
                                             class Rectangle{
       Тахир шугам                                private:
                                                    int numVertices;
                                                    float *xCoord, *yCoord;
                                                  public:
Тэгш өнцөгт                                         void set(float *x, float *y, int nV);
                     Гурвалжин
                                                    float area();
                                             };
  class Polygon{                             class Triangle{
    private:                                    private:
     int numVertices;                             int numVertices;
     float *xCoord, *yCoord;                     float *xCoord, *yCoord;
    public:                                     public:
     void set(float *x, float *y, int nV);       void set(float *x, float *y, int nV);
                                                 float area();
  };                                                                              1
                                             };
Удамшлын хэрэгцээ
                                    class Polygon{
        Тахир шугам                     protected:
                                         int numVertices;
                                         float *xCoord, float *yCoord;
                                        public:
                                          void set(float *x, float *y, int nV);
Тэгш өнцөгт                         };
                    Гурвалжин

                                    class Rectangle{
                                        protected:
class Rectangle : public Polygon{        int numVertices;
   public:                               float *xCoord, float *yCoord;
      float area();                     public:
                                          void set(float *x, float *y, int nV);
};
                                          float area();                       2
                                    };
Удамшлын хэрэгцээ
                                    class Polygon{
                                        protected:
       Тахир шугам
                                         int numVertices;
                                         float *xCoord, float *yCoord;
                                        public:
                                          void set(float *x, float *y, int nV);
Тэгш өнцөгт                         };
                   Гурвалжин

                                    class Triangle{
                                        protected:
 class Triangle : public Polygon{        int numVertices;
    public:                              float *xCoord, float *yCoord;
     float area();                      public:
                                          void set(float *x, float *y, int nV);
 };
                                          float area();                      3
                                    };
Удамшлын хэрэгцээ
                       x
                               class Point{
           Цэг         y          protected:
                                     int x, y;
                                  public:
   Тойрог 3D-цэг                     void set (int a, int b);
       x           x
                               };
       y           y
       r           z


class Circle : public Point{   class 3D-Point: public Point{
   private:                       private:
         double r;                      int z;
};                             };
                                                                4
Удамшлын хэрэгцээ
• Анхны классыг нэмэгдүүлэх
         Тахир шугам                       Цэг


  Тэгш өнцөгт     Гурвалжин            Тойрог 3D-цэг

• Анхны классыг нарийвчлах
                       ComplexNumber      real
                                          imag


                RealNumber      ImaginaryNumber   imag
     real                                                5
Удамшил?
Удамшил нь өмнө нь тодорхойлогдсон классаас
 шинэ класс үүсгэх арга
  • Классыг өргөтгөх ( шинж чанарууд нэмэх)
  • Классыг дахин ашиглах( өөр классд
    хэрэглэх)
  • Классыг засварлах( гишүүн функцийг
    дахин тодорхойлж )
  Үр дүнд нь: Санах ой ба хугацаа хэмнэх, код
    зохицол сайжирч хөгжүүлэлт
    хялбарчлагддаг                          6
Удамшсан классыг тодорхойлох
• Syntax:
  class DerivedClassName : access-level BaseClassName
  үүнд
   – access-level удамшлын хандалтын түвшинг
     тодорхойлно
      • private //default-р
      • public
• Ямар ч класс эх класс байж болно
  – Иймд удамшсан класс өөр классын эх байж болно
                                                        7
Классын удамшил
            Цэг                     class Point{
                                       protected:
                                          int x, y;
           3D-цэг                      public:
                                          void set (int a, int b);
                                    };
             Бөмбөлөг
   class 3D-Point : public Point{   class Sphere : public 3D-цэг{
      private:                         private:
         double z;                       double r;
      ……                               ……
   };                               };
Цэг нь 3D-цэг-ийн эх класс харин 3D-цэг нь бөмбөлөгийн(Sphere) эх    8
Юу удамших вэ?

• Зарчмын хувьд эх классын бүх гишүүд
  удамшиж болох хэдий ч
  – удамших зөвшөөрлөөс хамаарна




                                        9
Удамших гишүүнийг хянах
        • Удамших гишүүнийг хянах
          – класс зарлах үеийн
          – удамшлын төрөл тодорхойлох


          class Point{
             protected: int x, y;
             public: void set(int a, int b);
          };

          class Circle : public Point{
             ……
          };                                   10
Удамших эрх
                                Удамшлын төрөл
                         private    protected    public
 Гишүүдийн
 хандалт




              private       -           -           -
             protected   private    protected   protected
              public     private    protected    public

• Эх классын protected, public гишүүд удамшина,
• удамших төрлөөс хамааран гишүүдийн хандалт
  өөрчлөгдөнө


                                                            11
Классын удамшил
class mother{                        class grandDaughter : public daughter {
   protected: int mProc;                private: double gPriv;
   public: int mPubl;                   public: void gFoo ( );
   private: int mPriv;               };
};
    private/protected/public
                                       int main() {
class daughter : --------- mother{
                                           /*….*/
   private: double dPriv;
                                       }
   public: void mFoo(();
                 dFoo );
};

void daughter :: dFoo ( ){
   mPriv = 10; //error
   mProc = 20;
                                                                           12
};
Юу удамших вэ?

• Зарчмын хувьд эх классын бүх гишүүд
  удамшиж болох хэдий ч
  – удамших зөвшөөрлөөс хамаарна

• Гэхдээ дараах функцууд удамшдаггүй
  – Байгуулагч ба устгагч
  – operator=() оператор гишүүн
  – найз функц
 эдгээр функцууд зөвхөн энэ класст
                                        13
 хамаарах тул
Удамшлын байгуулагчийн дүрэм
         эх классын байгуулагч, устгагч удамшсан
         классын объект үүсэх бүрт дуудагдана
         (ажиллана).

class A {                                 class B : public A
  public:                                 {
   A()                                      public:
     {cout<< “A:default”<<endl;}             B (int a)
   A (int a)                                    {cout<<“B”<<endl;}
     {cout<<“A:parameter”<<endl;}         };
};

                                    output:   A:default
                  B test(1);                  B                 14
Удамшлын байгуулагчийн дүрэм
    Аль аль байгуулагчийг дахин тодорхойлж
     болно
     DerivedClassCon ( derivedClass args ) : BaseClassCon ( baseClass
     args )
          { DerivedClass constructor body }

class A {                                        class C : public A {
  public:                                          public:
   A()                                              C (int a) : A(a)
     {cout<< “A:default”<<endl;}                       {cout<<“C”<<endl;}
   A (int a)                                     };
     {cout<<“A:parameter”<<endl;}
};
                                       output:     A:parameter
                  C test(1);                       C                    15
Өөрийн гишүүнийг утгатай
               болгох
Удамшсан классын байгуулагч        class Point{
өөрийн гишүүнийг утгатай              protected:
болгохоос гадна эхээс ирсэн              int x, y;
гишүүнийг утгатай болгоно.
                                      public:
                        x                void set(int a, int b);
            Point       y
                                   };
  x
                                   class Circle{
  y   Circle
  r                                   protected:
                                         int x, y;
  class Circle : public Point{         private:
     private:                            double r;
           double r;                   public:
     public:                             void set(int a, int b);
           void set_r(double c);         void set_r(double c);
                                                                   16
  };                               };
…
  • Эх классын гишүүн функцийг хүү классад даран
    тодорхойлж болно
      – Эхтэйгээ адил гишүүн функцтэй байж болно.
      – Хүү класс өөрийн хувилбараар ажиллана.



class A {
                                        class B : public A {
  protected:
                                          public:
   int x, y;
                                           void print ()
  public:
                                              {cout<<“From B”<<endl;}
   void print ()
                                        };
          {cout<<“From A”<<endl;}
};
                                                                   17
Хандах арга
 class Point{
                                         class Circle : public Point{
    protected:
                                          private: double r;
       int x, y;
                                          public:
    public:
                                            void set (int a, int b, double c) {
       void set(int a, int b)
                                                Point :: set(a, b); //same name function call
           {x=a; y=b;}
                                                r = c;
       void foo ();
                                            }
       void print();
                                            void print(); };
 };

                                             Circle C;
Point A;                                     C.set(10,10,100); // from class Circle
A.set(30,50); // from base class Point       C.foo (); // from base class Point
A.print(); // from base class Point          C.print(); // from class Circle
                                                                                      18
Дээрх бүгдийг жишээ
 классад нэгтгэвэл
          • Time нь эх класс
          • ExtTime нь public-р удамшсан
 Time       хүү. Хүү класс нь
             – Эхийн байгуулагчаас бусдыг
               удамшуулж чаддаг
             – Эхийн public ба protected
               гишүүдэд хадаж чаддаг
             – Өөрийн гишүүн өгөгдөлтэй
ExtTime      – Өөрийн байгуулагчтай
             – Гишүүн функцтэй
             – Эхийн зарим функцийг даран
               тодорхойлдог
             Байхаар зохион байгуул
                                            19
класс Time –г тодорхойлох
// SPECIFICATION FILE                                  ( time.h)
class Time{
 public :
     void Set ( int h, int m, int s ) ;
     void Increment ( ) ;
     void Write ( ) const ;
     Time ( int initH, int initM, int initS ) ; // constructor
     Time ( ) ;                                 // default constructor
 protected :
     int        hrs ;
     int        mins ;
     int        secs ;
};

                                                                         20
Классын интерфэйс диаграм

              Time класс

       Set
                   Protected data:
     Increment
                   hrs
       Write
                   mins

       Time        secs

       Time


                                     21
Удамшсан класс ExtTime
// SPECIFICATION FILE                                        ( exttime.h)

#include “time.h”
enum ZoneType {EST, CST, MST, PST, EDT, CDT, MDT, PDT } ;

class ExtTime : public Time
          // Time is the base class and use public inheritance
{
    public :
     void    Set ( int h, int m, int s, ZoneType timeZone ) ;
     void    Write ( ) const; //overridden
     ExtTime (int initH, int initM, int initS, ZoneType initZone ) ;
     ExtTime (); // default constructor
private :
   ZoneType zone ;            // added data member
};
                                                                            22
Классын интерфэйс диаграм
              ExtTime класс


      Set          Set

 Increment     Increment   Protected data:
                           hrs
   Write          Write
                           mins
  ExtTime         Time
                           secs
    ExtTime        Time
              Private
              data:
              zone                           23
ExtTime-г зохион байгуулах

Default Constructor

ExtTime :: ExtTime ( )            ExtTime et1;
{
    zone = EST ;
}                           et1
                                    hrs = 0
ExtTime –н объект үүсэхэд           mins = 0
эх классын default                  secs = 0
байгуулагч Time()                   zone = EST
автоматаар дуудагдана.
                                                 24
ExtTime-г зохион байгуулах
Өөр нэг байгуулагч
 ExtTime :: ExtTime (int initH, int initM, int initS, ZoneType
    initZone)
          : Time (initH, initM, initS)
          // constructor initializer
 {
        zone = initZone ;
 }
 ExtTime *et2 =                            5000
    new ExtTime(8,30,0,EST);
                                           hrs = 8
             et2   6000                    mins = 30
                       5000
                       ???                 secs = 0
                                           zone = EST            25
ExtTime-г зохион байгуулах
      void ExtTime :: Set (int h, int m, int s, ZoneType timeZone)
      {
         Time :: Set (hours, minutes, seconds); // same name function call
         zone = timeZone ;
      }

void ExtTime :: Write ( ) const // function overriding
{
  string zoneString[8] =
         {“EST”, “CST”, MST”, “PST”, “EDT”, “CDT”, “MDT”, “PDT”} ;

    Time :: Write ( ) ;
    cout <<‘ ‘<<zoneString[zone]<<endl;
}                                                                            26
ExtTime-тай ажиллах
#include “exttime.h”
……
int main()
{
     ExtTime    thisTime ( 8, 35, 0, PST ) ;
     ExtTime    thatTime ;                   // default constructor called
     thatTime.Write( ) ;                     // outputs 00:00:00 EST
     thatTime.Set (16, 49, 23, CDT) ;
     thatTime.Write( ) ;                     // outputs 16:49:23 CDT
     thisTime.Increment ( ) ;
     thisTime.Increment ( ) ;
     thisTime.Write ( ) ;                    // outputs 08:35:02 PST
}
                                                                        27
Нэгдсэн дүгнэлт
• Удамшил нь байгаа төрлийг нарийвчлан
  эсвэл өргөтгөн шинэ төрөл тодорхойлох
  механизм.

• Зарчмын хувьд байгуулагчаас бусад эх
  классын гишүүдийг хандах эрхийг нь
  өөрчлөн удамшуулж болно.

                                          28

More Related Content

Lecture3 охп удамшил

  • 1. Удамшлын хэрэгцээ class Rectangle{ Тахир шугам private: int numVertices; float *xCoord, *yCoord; public: Тэгш өнцөгт void set(float *x, float *y, int nV); Гурвалжин float area(); }; class Polygon{ class Triangle{ private: private: int numVertices; int numVertices; float *xCoord, *yCoord; float *xCoord, *yCoord; public: public: void set(float *x, float *y, int nV); void set(float *x, float *y, int nV); float area(); }; 1 };
  • 2. Удамшлын хэрэгцээ class Polygon{ Тахир шугам protected: int numVertices; float *xCoord, float *yCoord; public: void set(float *x, float *y, int nV); Тэгш өнцөгт }; Гурвалжин class Rectangle{ protected: class Rectangle : public Polygon{ int numVertices; public: float *xCoord, float *yCoord; float area(); public: void set(float *x, float *y, int nV); }; float area(); 2 };
  • 3. Удамшлын хэрэгцээ class Polygon{ protected: Тахир шугам int numVertices; float *xCoord, float *yCoord; public: void set(float *x, float *y, int nV); Тэгш өнцөгт }; Гурвалжин class Triangle{ protected: class Triangle : public Polygon{ int numVertices; public: float *xCoord, float *yCoord; float area(); public: void set(float *x, float *y, int nV); }; float area(); 3 };
  • 4. Удамшлын хэрэгцээ x class Point{ Цэг y protected: int x, y; public: Тойрог 3D-цэг void set (int a, int b); x x }; y y r z class Circle : public Point{ class 3D-Point: public Point{ private: private: double r; int z; }; }; 4
  • 5. Удамшлын хэрэгцээ • Анхны классыг нэмэгдүүлэх Тахир шугам Цэг Тэгш өнцөгт Гурвалжин Тойрог 3D-цэг • Анхны классыг нарийвчлах ComplexNumber real imag RealNumber ImaginaryNumber imag real 5
  • 6. Удамшил? Удамшил нь өмнө нь тодорхойлогдсон классаас шинэ класс үүсгэх арга • Классыг өргөтгөх ( шинж чанарууд нэмэх) • Классыг дахин ашиглах( өөр классд хэрэглэх) • Классыг засварлах( гишүүн функцийг дахин тодорхойлж ) Үр дүнд нь: Санах ой ба хугацаа хэмнэх, код зохицол сайжирч хөгжүүлэлт хялбарчлагддаг 6
  • 7. Удамшсан классыг тодорхойлох • Syntax: class DerivedClassName : access-level BaseClassName үүнд – access-level удамшлын хандалтын түвшинг тодорхойлно • private //default-р • public • Ямар ч класс эх класс байж болно – Иймд удамшсан класс өөр классын эх байж болно 7
  • 8. Классын удамшил Цэг class Point{ protected: int x, y; 3D-цэг public: void set (int a, int b); }; Бөмбөлөг class 3D-Point : public Point{ class Sphere : public 3D-цэг{ private: private: double z; double r; …… …… }; }; Цэг нь 3D-цэг-ийн эх класс харин 3D-цэг нь бөмбөлөгийн(Sphere) эх 8
  • 9. Юу удамших вэ? • Зарчмын хувьд эх классын бүх гишүүд удамшиж болох хэдий ч – удамших зөвшөөрлөөс хамаарна 9
  • 10. Удамших гишүүнийг хянах • Удамших гишүүнийг хянах – класс зарлах үеийн – удамшлын төрөл тодорхойлох class Point{ protected: int x, y; public: void set(int a, int b); }; class Circle : public Point{ …… }; 10
  • 11. Удамших эрх Удамшлын төрөл private protected public Гишүүдийн хандалт private - - - protected private protected protected public private protected public • Эх классын protected, public гишүүд удамшина, • удамших төрлөөс хамааран гишүүдийн хандалт өөрчлөгдөнө 11
  • 12. Классын удамшил class mother{ class grandDaughter : public daughter { protected: int mProc; private: double gPriv; public: int mPubl; public: void gFoo ( ); private: int mPriv; }; }; private/protected/public int main() { class daughter : --------- mother{ /*….*/ private: double dPriv; } public: void mFoo((); dFoo ); }; void daughter :: dFoo ( ){ mPriv = 10; //error mProc = 20; 12 };
  • 13. Юу удамших вэ? • Зарчмын хувьд эх классын бүх гишүүд удамшиж болох хэдий ч – удамших зөвшөөрлөөс хамаарна • Гэхдээ дараах функцууд удамшдаггүй – Байгуулагч ба устгагч – operator=() оператор гишүүн – найз функц эдгээр функцууд зөвхөн энэ класст 13 хамаарах тул
  • 14. Удамшлын байгуулагчийн дүрэм эх классын байгуулагч, устгагч удамшсан классын объект үүсэх бүрт дуудагдана (ажиллана). class A { class B : public A public: { A() public: {cout<< “A:default”<<endl;} B (int a) A (int a) {cout<<“B”<<endl;} {cout<<“A:parameter”<<endl;} }; }; output: A:default B test(1); B 14
  • 15. Удамшлын байгуулагчийн дүрэм Аль аль байгуулагчийг дахин тодорхойлж болно DerivedClassCon ( derivedClass args ) : BaseClassCon ( baseClass args ) { DerivedClass constructor body } class A { class C : public A { public: public: A() C (int a) : A(a) {cout<< “A:default”<<endl;} {cout<<“C”<<endl;} A (int a) }; {cout<<“A:parameter”<<endl;} }; output: A:parameter C test(1); C 15
  • 16. Өөрийн гишүүнийг утгатай болгох Удамшсан классын байгуулагч class Point{ өөрийн гишүүнийг утгатай protected: болгохоос гадна эхээс ирсэн int x, y; гишүүнийг утгатай болгоно. public: x void set(int a, int b); Point y }; x class Circle{ y Circle r protected: int x, y; class Circle : public Point{ private: private: double r; double r; public: public: void set(int a, int b); void set_r(double c); void set_r(double c); 16 }; };
  • 17. … • Эх классын гишүүн функцийг хүү классад даран тодорхойлж болно – Эхтэйгээ адил гишүүн функцтэй байж болно. – Хүү класс өөрийн хувилбараар ажиллана. class A { class B : public A { protected: public: int x, y; void print () public: {cout<<“From B”<<endl;} void print () }; {cout<<“From A”<<endl;} }; 17
  • 18. Хандах арга class Point{ class Circle : public Point{ protected: private: double r; int x, y; public: public: void set (int a, int b, double c) { void set(int a, int b) Point :: set(a, b); //same name function call {x=a; y=b;} r = c; void foo (); } void print(); void print(); }; }; Circle C; Point A; C.set(10,10,100); // from class Circle A.set(30,50); // from base class Point C.foo (); // from base class Point A.print(); // from base class Point C.print(); // from class Circle 18
  • 19. Дээрх бүгдийг жишээ классад нэгтгэвэл • Time нь эх класс • ExtTime нь public-р удамшсан Time хүү. Хүү класс нь – Эхийн байгуулагчаас бусдыг удамшуулж чаддаг – Эхийн public ба protected гишүүдэд хадаж чаддаг – Өөрийн гишүүн өгөгдөлтэй ExtTime – Өөрийн байгуулагчтай – Гишүүн функцтэй – Эхийн зарим функцийг даран тодорхойлдог Байхаар зохион байгуул 19
  • 20. класс Time –г тодорхойлох // SPECIFICATION FILE ( time.h) class Time{ public : void Set ( int h, int m, int s ) ; void Increment ( ) ; void Write ( ) const ; Time ( int initH, int initM, int initS ) ; // constructor Time ( ) ; // default constructor protected : int hrs ; int mins ; int secs ; }; 20
  • 21. Классын интерфэйс диаграм Time класс Set Protected data: Increment hrs Write mins Time secs Time 21
  • 22. Удамшсан класс ExtTime // SPECIFICATION FILE ( exttime.h) #include “time.h” enum ZoneType {EST, CST, MST, PST, EDT, CDT, MDT, PDT } ; class ExtTime : public Time // Time is the base class and use public inheritance { public : void Set ( int h, int m, int s, ZoneType timeZone ) ; void Write ( ) const; //overridden ExtTime (int initH, int initM, int initS, ZoneType initZone ) ; ExtTime (); // default constructor private : ZoneType zone ; // added data member }; 22
  • 23. Классын интерфэйс диаграм ExtTime класс Set Set Increment Increment Protected data: hrs Write Write mins ExtTime Time secs ExtTime Time Private data: zone 23
  • 24. ExtTime-г зохион байгуулах Default Constructor ExtTime :: ExtTime ( ) ExtTime et1; { zone = EST ; } et1 hrs = 0 ExtTime –н объект үүсэхэд mins = 0 эх классын default secs = 0 байгуулагч Time() zone = EST автоматаар дуудагдана. 24
  • 25. ExtTime-г зохион байгуулах Өөр нэг байгуулагч ExtTime :: ExtTime (int initH, int initM, int initS, ZoneType initZone) : Time (initH, initM, initS) // constructor initializer { zone = initZone ; } ExtTime *et2 = 5000 new ExtTime(8,30,0,EST); hrs = 8 et2 6000 mins = 30 5000 ??? secs = 0 zone = EST 25
  • 26. ExtTime-г зохион байгуулах void ExtTime :: Set (int h, int m, int s, ZoneType timeZone) { Time :: Set (hours, minutes, seconds); // same name function call zone = timeZone ; } void ExtTime :: Write ( ) const // function overriding { string zoneString[8] = {“EST”, “CST”, MST”, “PST”, “EDT”, “CDT”, “MDT”, “PDT”} ; Time :: Write ( ) ; cout <<‘ ‘<<zoneString[zone]<<endl; } 26
  • 27. ExtTime-тай ажиллах #include “exttime.h” …… int main() { ExtTime thisTime ( 8, 35, 0, PST ) ; ExtTime thatTime ; // default constructor called thatTime.Write( ) ; // outputs 00:00:00 EST thatTime.Set (16, 49, 23, CDT) ; thatTime.Write( ) ; // outputs 16:49:23 CDT thisTime.Increment ( ) ; thisTime.Increment ( ) ; thisTime.Write ( ) ; // outputs 08:35:02 PST } 27
  • 28. Нэгдсэн дүгнэлт • Удамшил нь байгаа төрлийг нарийвчлан эсвэл өргөтгөн шинэ төрөл тодорхойлох механизм. • Зарчмын хувьд байгуулагчаас бусад эх классын гишүүдийг хандах эрхийг нь өөрчлөн удамшуулж болно. 28