SlideShare une entreprise Scribd logo
1  sur  24
Р.Мижиддорж, КМТС
Amphibian
Driver               Conductor
House    Boat   - license            - Account number
                - Year of approval



  Houseboat                      TaxiDriver
                                 - area
   Удамшил нь нэг класс дээр үндэслэн өөр класс
    үүсгэх юм. Хэд хэдэн классаас өөр класс
    удамшуулах талаар авч үзье. Хэд хэдэн эх
    класстай байна гэдэг нь хэд хэдэн классын
    шинж чанарыг агуулсан класс үүсгэх юм.
   Байгуулагч функц аргумент шаарддаг
    удамшсан классын обьект зарлахад удамшсан
    класс нь эх классын байгуулагч функцийг
    аргументаар хангаж өгөх хэрэгтэй. Энэ нь
    удамшлын үед яригдах гол дүрэм юм. Иймд
    аргументаар хангаж өгөх асуудал заавал гарч
    ирнэ. Энэ үед байгуулагч функцийн анхны утга
    тогтоох жагсаалтыг хэрэглэх нь маш оновчтой
    шийдэл болдог юм.
Нийлмэл удамшил нь аливаа удамшсан класс нь нэгээс олон
үндсэн класстай байхыг зөвшөөрдөг. Жишээ нь:
class Date {    protected:        public:           void Display();
                int day;          Date();           Date Get();
                int month;        ~Date();           void Set();
                int year;
           };

class Time {protected:            public:            void Display();
               int hour;          Time();           Time Get();
               int minute;        ~Time();          void Set();
               int second;
           };

class DateTime :public Date, public Time{
                      int digital;
                        public:
                                 void Display();
                   };                            DateTime –класс нь Date, Time –ийн
                                                гишүүдийг агуулна.

                                             DateTime watch; // watch; объект
Одоо watch.Display(); гэж Display –г дуудаж болно. Хэрэв
  Display –г дахин тодорхойлоогүй бол дээрх үйлдэл нь
  эргэлзээтэй.
Үүнийг шийдэхдээ
      watch.Date::Display();
  эсвэл
      watch.Time::Display();
Виртуал үндсэн класс
                       CPerson
                                           Хүн
                     m_name : string
                     m_age : int

                     GetName() cost
                     GetAge() const
                     SetName(string)
                                                 Цалинтай
       Инженер       SetAge(int)                   хүн
                     Print() const




                                         CSalaried
  CEngineer
                                        m_nSalary : int
m_nEngT ype : int
                                        GetSalary()
GetEngT ype()                           SetSalary(int)
SetEngT ype(int)                        Print() const
Print() const         CSalariedEng
                        m_nDept : int

                        GetDept()
                        SetDept(int)
                        Print() const
Виртуал үндсэн класс
                           CPerson
                                                 Хүн
                         m_name : string
                         m_age : int


CSalariedEng классын байгуулагч функц нь өөрийн эх
                        GetName() cost
                        GetAge() const
классуудыхаа байгуулагч SetName(string) анхны утгаар хангах
                         функцийг                     Цалинтай
        Инженер         SetAge(int)
ёстой. Өөрөөр хэлбэл CPerson –н хоёр хуулбарыг агуулах ба
                        Print() const

энэ 2 хуулбар нь хоорондоо зөрчилдөж магадгүй.
                                               CSalaried
      CEngineer
                                              m_nSalary : int
    m_nEngT ype : int
                                              GetSalary()
    GetEngT ype()                             SetSalary(int)
    SetEngT ype(int)                          Print() const
    Print() const         CSalariedEng
                            m_nDept : int

                            GetDept()
                            SetDept(int)
                            Print() const
Виртуал үндсэн класс

                             CPerson                             CPerson
                           m_name : string                    m_name : string

CSalariedEng классын байгуулагч функц нь өөрийн эх
                           m_age : int                        m_age : int


классуудыхаа байгуулагчcost
                   GetName()
                   GetAge() const
                                 функцийгGetName() cost утгаар хангах
                                          анхны
                                         GetAge() const
ёстой. Өөрөөр хэлбэл CPerson –н хоёр хуулбарыг агуулах ба
                   SetName(string)
                   SetAge(int)
                                         SetName(string)
                                         SetAge(int)
энэ 2 хуулбар нь хоорондоо зөрчилдөж магадгүй.
                   Print() const         Print() const



                                                                                 CSalaried
         CEngineer
                                                                                m_nSalary : int
       m_nEngT ype : int

                                                                                GetSalary()
       GetEngT ype()                         CSalariedEng
                                                                                SetSalary(int)
       SetEngT ype(int)                       m_nDept : int                     Print() const
       Print() const
                                              GetDept()
                                              SetDept(int)
                                              Print() const
CSalariedEng классын байгуулагч функц нь өөрийн эх
классуудыхаа байгуулагч функцийг анхны утгаар хангах
ёстой. Ө.х CPerson –н хоёр хуулбарыг агуулах ба энэ 2
хуулбар нь хоорондоо зөрчилдөж магадгүй.


Нийлмэл удамшлын үед анхдагч үндсэн классын
(CPerson) хуулбар нь ач класс (CSalariedEng)-д ганц
байх ёстой. Үүнийг virtual түлхүүр үгээр шийддэг.
class CPerson {. . .};
class CEngineer : virtual public CPerson{. . . };

одоогоор virtual түлхүүр үг ямар ч ач холбогдолгүй.

class CSalaried : virtual public CPerson{. . . };

Харин
class CSalariedEng : public CEngineer, public CSalaried
  {. . . };

гэж нийлмэл удашил зарлах үед CPerson -н зөвхөн
  нэг хуулбар үүсэх ѐстой.


                                                    Person.dev
class CPerson { protected:
                 int age;
            public:
                CPerson(int a){ age=a;}
       };
class CEngineer :virtual public CPerson {
      protected:
                   int m_nEngType;
      public:
            CEngineer(int d, int a): CPerson(a){
                    m_nEngType =d;}
       };
 class CSalaried :virtual public CPerson{
            int m_nSalary;
          public: CSalaried (int t, int a):CPerson(a)
                   {m_nSalary =t; } } ;         Person.dev
class CSalariedEng :public CEngineer , public CSalaried {
           int m_nDept;
public:
 CSalariedEng (int s, int t, int d, int a):
 m_nDept(s), CPerson(a), CEngineer(d), CSalaried(t){};
};
CSalariedEng байгуулагч функц нь зөвхөн өөрийгөө
   байгуулаад зогсохгүй өөрийн эх классуудыг
   цаашилбал CPerson- классын хэсгийг өөрөө
   үүсгэдэг.


                                                Person.dev
CSalariedEng –н объект үүсэх үед virtual түлхүүр үг
 нь CEngineer ба CSalaried классуудад өөрсдийн
 эх классийг үүсгэх шаардлагaгүй гэдгийг
 хэлдэг.
Учир нь virtual түлхүүр үгийг ашигласнаар
 CSalariedEng нь анхдагч үндсэн (CPerson)
 классыг өөрөө үүсгэдэг.
 CSalariedEng sengr(173,30000,10,43);
Харин CEngineer ба CSalaried –н объект
 тодорхойлбол
CEngineer engr(10,43);
CSalaried sman(30000, 43); объект бүр үндсэн
 классын байгуулагч функцыг дуудах болно.
 Эдгээр объектын хувьд virtual түлхүүр үг нь ач
 холбогдолгүй юм. Харин CSalariedEng-н
 объект тодорхойлох үед түүний хэрэглээ гарч
 байна.

                                             Person.dev
sengr(173,30000,10,43);
   43                              43
   43                              10
   10                             30000
  30000                           173
  173
                              sengr зөрчилгүй
Sengr-н нас хоёр хувь байгаа нь яваандаа
  зөрчил үүсгэж магадгүй
Классуудын хамаарал
Хоёр класс хоорондоо харилцан
хамаарах хоёр ерөнхий зүйл байна:
  1. Удамшил (“is-a” харилцаа, . . . a
  kind of. . .)
  (Every employee is a person.
  Ажилчин бүр хүн.)

  2. Бүрдмэл (“has-a” харилцаа)
  (Every person has date of birth.
  Хүн бүр төрсөн өдөртэй.)
Багш


               Ажилчин

                   Хүн
Классуудын хамаарал, энгийн удамшил (Багш нар)
Цалинтай     Цалинтай
           хүн
                        инженер            Инженер




                         Хүн

Классуудын хамаарал, нийлмэл удамшил (Цалинтай инженерүүд)
Бүрдмэл харьцаа
   Өөр класс төрлийн нэг буюу түүнээс олон
    объект гишүүн өгөгдөлтэй байх
   Класс хоорондын харилцаа нь “has-a”
   Гишүүн объектийн байгуулагчийн
    аргументийг классын байгуулагчийн
    толгойн хэсэгт тодорхойлно
      Бүрдмэл классын байгуулагч аргументдаа объект
       авах
      Бүрдмэл классын байгуулагч аргументдаа объектийн
       утгыг авах
   Классын гишүүн объект нь зарлагдсан
    дарааллаараа байгуулагдана
   Утга олголт (= оператор дахин
                  тодорхойлох хэрэгцээ гарна)
class List {
public:
List();
void addToFront(int);
int firstElement();
int length();
int includes(int);
void remove(int);
private: //бүхэл тоо хадгалах өгөгдлийн бүтэц
};
class Set {
public:
Set();
void add(int);
int size();
int includes(int);
private:
List data; // бүрдмэл харьцаа
};
int Set::size() { return data.length(); }
int Set::includes(int newValue) {
  return data.includes(newValue); }
void Set::add(int newValue)
{ if( ! includes(newValue) )
  data.addToFront(newValue); // үгүй бол
             // олонлог элементийг нэг л удаа
             // хадгалах тул үйлдэл хийхгүй
}
Set::Set() : data() { // Олонлогийн элемент
}
МАШИН                  ХӨДӨЛГҮҮР        class_comp.cpp

 Composition: Машин бүр хөдөлгүүртэй. (байхгүй байж болохгүй)


       МАШИН                   ЗОРЧИГЧ         class_agr.cpp

Aggregation: Машин зорчигчтой байж болно.
                               (зорчигчгүй байж болно)

Contenu connexe

Tendances (20)

Лекц №11
Лекц №11Лекц №11
Лекц №11
 
PL Lecture4
PL Lecture4PL Lecture4
PL Lecture4
 
өгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэсөгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэс
 
CS203 Лекц02 Oop
CS203 Лекц02  OopCS203 Лекц02  Oop
CS203 Лекц02 Oop
 
Sw203 Lecture10 Polymorphism
Sw203 Lecture10 PolymorphismSw203 Lecture10 Polymorphism
Sw203 Lecture10 Polymorphism
 
Лекц 9(Заагч)
Лекц 9(Заагч)Лекц 9(Заагч)
Лекц 9(Заагч)
 
Ci prog tolgoi file хичээл 2
Ci prog tolgoi file хичээл 2Ci prog tolgoi file хичээл 2
Ci prog tolgoi file хичээл 2
 
массив
массивмассив
массив
 
U.cs101 алгоритм программчлал-12
U.cs101   алгоритм программчлал-12U.cs101   алгоритм программчлал-12
U.cs101 алгоритм программчлал-12
 
C cons
C consC cons
C cons
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
 
Lec4 хereglegchiinpunkts
Lec4 хereglegchiinpunktsLec4 хereglegchiinpunkts
Lec4 хereglegchiinpunkts
 
It101 lec6 10.06
It101 lec6 10.06It101 lec6 10.06
It101 lec6 10.06
 
Cs203 lecture13 composition
Cs203 lecture13 compositionCs203 lecture13 composition
Cs203 lecture13 composition
 
Sw203 Lecture7 Method Override
Sw203 Lecture7  Method OverrideSw203 Lecture7  Method Override
Sw203 Lecture7 Method Override
 
C
CC
C
 
CS203 Лекц01 Prefeace
CS203 Лекц01  PrefeaceCS203 Лекц01  Prefeace
CS203 Лекц01 Prefeace
 
Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11Өгөгдлийн бүтэц 11
Өгөгдлийн бүтэц 11
 
Day 1 database
Day 1   databaseDay 1   database
Day 1 database
 
Лекц №12
Лекц №12Лекц №12
Лекц №12
 

En vedette

En vedette (6)

Dev c++ program ajilluulax
Dev c++ program ajilluulaxDev c++ program ajilluulax
Dev c++ program ajilluulax
 
геометр прогресс
геометр прогрессгеометр прогресс
геометр прогресс
 
геометр прогрессийн ерөнхий гишүүний томъёо
геометр прогрессийн ерөнхий гишүүний томъёогеометр прогрессийн ерөнхий гишүүний томъёо
геометр прогрессийн ерөнхий гишүүний томъёо
 
Engineeriin matematica ii 1997
Engineeriin matematica ii 1997Engineeriin matematica ii 1997
Engineeriin matematica ii 1997
 
Bk setguul
Bk setguulBk setguul
Bk setguul
 
Математикийн холбогдолтой сайтууд
Математикийн холбогдолтой сайтуудМатематикийн холбогдолтой сайтууд
Математикийн холбогдолтой сайтууд
 

Similaire à Lecture 4 нийлмэл удамшил

Similaire à Lecture 4 нийлмэл удамшил (9)

Лекц №10
Лекц №10Лекц №10
Лекц №10
 
Lecture
LectureLecture
Lecture
 
001cclass 120926194905-phpapp02
001cclass 120926194905-phpapp02001cclass 120926194905-phpapp02
001cclass 120926194905-phpapp02
 
Лекц №13
Лекц №13Лекц №13
Лекц №13
 
үндсэн функцууд
үндсэн функцуудүндсэн функцууд
үндсэн функцууд
 
Лаборатор-3
Лаборатор-3Лаборатор-3
Лаборатор-3
 
Vb.net mon1
Vb.net mon1Vb.net mon1
Vb.net mon1
 
Lab1_1220880325
Lab1_1220880325Lab1_1220880325
Lab1_1220880325
 
Lab1 1220880325
Lab1 1220880325Lab1 1220880325
Lab1 1220880325
 

Lecture 4 нийлмэл удамшил

  • 3. Driver Conductor House Boat - license - Account number - Year of approval Houseboat TaxiDriver - area
  • 4. Удамшил нь нэг класс дээр үндэслэн өөр класс үүсгэх юм. Хэд хэдэн классаас өөр класс удамшуулах талаар авч үзье. Хэд хэдэн эх класстай байна гэдэг нь хэд хэдэн классын шинж чанарыг агуулсан класс үүсгэх юм.  Байгуулагч функц аргумент шаарддаг удамшсан классын обьект зарлахад удамшсан класс нь эх классын байгуулагч функцийг аргументаар хангаж өгөх хэрэгтэй. Энэ нь удамшлын үед яригдах гол дүрэм юм. Иймд аргументаар хангаж өгөх асуудал заавал гарч ирнэ. Энэ үед байгуулагч функцийн анхны утга тогтоох жагсаалтыг хэрэглэх нь маш оновчтой шийдэл болдог юм.
  • 5. Нийлмэл удамшил нь аливаа удамшсан класс нь нэгээс олон үндсэн класстай байхыг зөвшөөрдөг. Жишээ нь: class Date { protected: public: void Display(); int day; Date(); Date Get(); int month; ~Date(); void Set(); int year; }; class Time {protected: public: void Display(); int hour; Time(); Time Get(); int minute; ~Time(); void Set(); int second; }; class DateTime :public Date, public Time{ int digital; public: void Display(); }; DateTime –класс нь Date, Time –ийн гишүүдийг агуулна. DateTime watch; // watch; объект
  • 6. Одоо watch.Display(); гэж Display –г дуудаж болно. Хэрэв Display –г дахин тодорхойлоогүй бол дээрх үйлдэл нь эргэлзээтэй. Үүнийг шийдэхдээ watch.Date::Display(); эсвэл watch.Time::Display();
  • 7. Виртуал үндсэн класс CPerson Хүн m_name : string m_age : int GetName() cost GetAge() const SetName(string) Цалинтай Инженер SetAge(int) хүн Print() const CSalaried CEngineer m_nSalary : int m_nEngT ype : int GetSalary() GetEngT ype() SetSalary(int) SetEngT ype(int) Print() const Print() const CSalariedEng m_nDept : int GetDept() SetDept(int) Print() const
  • 8. Виртуал үндсэн класс CPerson Хүн m_name : string m_age : int CSalariedEng классын байгуулагч функц нь өөрийн эх GetName() cost GetAge() const классуудыхаа байгуулагч SetName(string) анхны утгаар хангах функцийг Цалинтай Инженер SetAge(int) ёстой. Өөрөөр хэлбэл CPerson –н хоёр хуулбарыг агуулах ба Print() const энэ 2 хуулбар нь хоорондоо зөрчилдөж магадгүй. CSalaried CEngineer m_nSalary : int m_nEngT ype : int GetSalary() GetEngT ype() SetSalary(int) SetEngT ype(int) Print() const Print() const CSalariedEng m_nDept : int GetDept() SetDept(int) Print() const
  • 9. Виртуал үндсэн класс CPerson CPerson m_name : string m_name : string CSalariedEng классын байгуулагч функц нь өөрийн эх m_age : int m_age : int классуудыхаа байгуулагчcost GetName() GetAge() const функцийгGetName() cost утгаар хангах анхны GetAge() const ёстой. Өөрөөр хэлбэл CPerson –н хоёр хуулбарыг агуулах ба SetName(string) SetAge(int) SetName(string) SetAge(int) энэ 2 хуулбар нь хоорондоо зөрчилдөж магадгүй. Print() const Print() const CSalaried CEngineer m_nSalary : int m_nEngT ype : int GetSalary() GetEngT ype() CSalariedEng SetSalary(int) SetEngT ype(int) m_nDept : int Print() const Print() const GetDept() SetDept(int) Print() const
  • 10. CSalariedEng классын байгуулагч функц нь өөрийн эх классуудыхаа байгуулагч функцийг анхны утгаар хангах ёстой. Ө.х CPerson –н хоёр хуулбарыг агуулах ба энэ 2 хуулбар нь хоорондоо зөрчилдөж магадгүй. Нийлмэл удамшлын үед анхдагч үндсэн классын (CPerson) хуулбар нь ач класс (CSalariedEng)-д ганц байх ёстой. Үүнийг virtual түлхүүр үгээр шийддэг.
  • 11. class CPerson {. . .}; class CEngineer : virtual public CPerson{. . . }; одоогоор virtual түлхүүр үг ямар ч ач холбогдолгүй. class CSalaried : virtual public CPerson{. . . }; Харин class CSalariedEng : public CEngineer, public CSalaried {. . . }; гэж нийлмэл удашил зарлах үед CPerson -н зөвхөн нэг хуулбар үүсэх ѐстой. Person.dev
  • 12. class CPerson { protected: int age; public: CPerson(int a){ age=a;} }; class CEngineer :virtual public CPerson { protected: int m_nEngType; public: CEngineer(int d, int a): CPerson(a){ m_nEngType =d;} }; class CSalaried :virtual public CPerson{ int m_nSalary; public: CSalaried (int t, int a):CPerson(a) {m_nSalary =t; } } ; Person.dev
  • 13. class CSalariedEng :public CEngineer , public CSalaried { int m_nDept; public: CSalariedEng (int s, int t, int d, int a): m_nDept(s), CPerson(a), CEngineer(d), CSalaried(t){}; }; CSalariedEng байгуулагч функц нь зөвхөн өөрийгөө байгуулаад зогсохгүй өөрийн эх классуудыг цаашилбал CPerson- классын хэсгийг өөрөө үүсгэдэг. Person.dev
  • 14. CSalariedEng –н объект үүсэх үед virtual түлхүүр үг нь CEngineer ба CSalaried классуудад өөрсдийн эх классийг үүсгэх шаардлагaгүй гэдгийг хэлдэг. Учир нь virtual түлхүүр үгийг ашигласнаар CSalariedEng нь анхдагч үндсэн (CPerson) классыг өөрөө үүсгэдэг. CSalariedEng sengr(173,30000,10,43); Харин CEngineer ба CSalaried –н объект тодорхойлбол CEngineer engr(10,43); CSalaried sman(30000, 43); объект бүр үндсэн классын байгуулагч функцыг дуудах болно. Эдгээр объектын хувьд virtual түлхүүр үг нь ач холбогдолгүй юм. Харин CSalariedEng-н объект тодорхойлох үед түүний хэрэглээ гарч байна. Person.dev
  • 15. sengr(173,30000,10,43); 43 43 43 10 10 30000 30000 173 173 sengr зөрчилгүй Sengr-н нас хоёр хувь байгаа нь яваандаа зөрчил үүсгэж магадгүй
  • 16. Классуудын хамаарал Хоёр класс хоорондоо харилцан хамаарах хоёр ерөнхий зүйл байна: 1. Удамшил (“is-a” харилцаа, . . . a kind of. . .) (Every employee is a person. Ажилчин бүр хүн.) 2. Бүрдмэл (“has-a” харилцаа) (Every person has date of birth. Хүн бүр төрсөн өдөртэй.)
  • 17. Багш Ажилчин Хүн Классуудын хамаарал, энгийн удамшил (Багш нар)
  • 18. Цалинтай Цалинтай хүн инженер Инженер Хүн Классуудын хамаарал, нийлмэл удамшил (Цалинтай инженерүүд)
  • 20. Өөр класс төрлийн нэг буюу түүнээс олон объект гишүүн өгөгдөлтэй байх  Класс хоорондын харилцаа нь “has-a”  Гишүүн объектийн байгуулагчийн аргументийг классын байгуулагчийн толгойн хэсэгт тодорхойлно  Бүрдмэл классын байгуулагч аргументдаа объект авах  Бүрдмэл классын байгуулагч аргументдаа объектийн утгыг авах  Классын гишүүн объект нь зарлагдсан дарааллаараа байгуулагдана  Утга олголт (= оператор дахин тодорхойлох хэрэгцээ гарна)
  • 21. class List { public: List(); void addToFront(int); int firstElement(); int length(); int includes(int); void remove(int); private: //бүхэл тоо хадгалах өгөгдлийн бүтэц };
  • 22. class Set { public: Set(); void add(int); int size(); int includes(int); private: List data; // бүрдмэл харьцаа };
  • 23. int Set::size() { return data.length(); } int Set::includes(int newValue) { return data.includes(newValue); } void Set::add(int newValue) { if( ! includes(newValue) ) data.addToFront(newValue); // үгүй бол // олонлог элементийг нэг л удаа // хадгалах тул үйлдэл хийхгүй } Set::Set() : data() { // Олонлогийн элемент }
  • 24. МАШИН ХӨДӨЛГҮҮР class_comp.cpp Composition: Машин бүр хөдөлгүүртэй. (байхгүй байж болохгүй) МАШИН ЗОРЧИГЧ class_agr.cpp Aggregation: Машин зорчигчтой байж болно. (зорчигчгүй байж болно)