09

Document Sample
09 Powered By Docstoc
					                                CHƢƠNG 9:

                                             THỪA KẾ
                                       (INHERITANCE)
          Bộ môn Hệ Thống Máy Tính và Truyền Thông
          Khoa Công Nghệ Thông Tin và Truyền Thông
          Đại học Cần Thơ




Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ             1
      Chƣơng 9


                                     Nội dung
      Khái niệm
      Lớp dẫn xuất đơn giản
      Ký hiệu các thứ bậc
      Hàm xây dựng và hàm hủy
      Thành viên lớp đƣợc bảo vệ
      Lớp cơ sở riêng, chung và đƣợc bảo vệ
      Đa thừa kế - Sự mơ hồ
      Hàm ảo - Lớp cơ sở ảo
      Chuyển kiểu
      Các toán tử đƣợc tái định nghĩa
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ      2
     Chƣơng 9


                                    Khái niệm
   Kế thừa từ các lớp có từ trƣớc.
   Ích lợi: có thể tận dụng lại
         Các thuộc tính chung
         Các hàm có thao tác tƣơng tự

               Lớp cơ sở            LỚP CHA
                                                   STUDENT
              (Base class)        (Super class)




            Lớp dẫn xuất             LỚP CON
                                                  CIT_STUDENT
           (Derived class)          (Sub class)

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                      3
     Chƣơng 9

                            Ví dụ minh họa
                  Ký hiệu                                           n
                                          ContactDir                               Contact
                composition

#include <iostream.h>                                    class ContactDir {
#include <string.h>                                       private:
class Contact {                                               int       Lookup(const char *name);
   private:
                                                              Contact **contacts;           // ds cac doi tac
      char *name;       // ten doi tac
                                                              int       dirSize;   // kich thuoc thu muc hien tai
      char *address; // dia chi doi tac
      char *tel; // so dien thoai                             int       maxSize; // kich thuoc thu muc toi da
   public:                                               public:
      Contact (const char *name,                               ContactDir (const int maxSize);
                const char *address, const char *tel);         ~ContactDir();
      ~Contact ();                                             void Insert(const Contact&);
      const char* Name () const { return name;}                void Delete(const char *name);
      const char* Address() const { return address;}           Contact* Find(const char *name);
      const char* Tel() const { return tel;}                   friend ostream& operator <<
      friend ostream& operator <<                                            (ostream&, ContactDir&);
                           ( ostream&, Contact& );             // …………
};                                                       };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                                      4
        Chƣơng 9

                        Ví dụ minh họa (tt)
                                                           n
                                  ContactDir                           Contact
          Ký hiệu
          Thừa kế
                                   SmartDir

   class SmartDir : public ContactDir {                        Contact* SmartDir::Recent (void) {
        private:                                                   return recent == 0 ? 0 :
           char    *recent;     // ten duoc tim gan nhat                         ContactDir::Find(recent);
        public:                                                }
           SmartDir(const int max) : ContactDir(max)           Contact* SmartDir::Find (const char *name) {
              { recent = 0; }                                      Contact *c = ContactDir::Find(name);
           Contact* Recent (void);                                 if (c != 0)
           Contact* Find (const char *name);                          recent = (char*) c->Name();
           // …………….                                               return c;
   };                                                          }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                                   5
     Chƣơng 9


   Ví dụ (tt) - mô tả trong bộ nhớ
      **contacts                             **contacts
        dirSize                               dirSize
       maxSize                               maxSize
     ContactDir                               *recent
                                             SmartDir
                          *contacts 1                        *contacts 1
    Contact 1             *contacts 2            Contact 1   *contacts 2
                          *contacts 3                        *contacts 3
                               …                                 …
    Contact 2                                    Contact 2
                           *contacts i                       *contacts i
                               …                                 …
       …                                            …
                          *contacts n                        *contacts n

    Contact i                                    Contact i



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                 6
      Chƣơng 9


        Hàm xây dựng và hàm hủy
      Trong thừa kế, khi khởi tạo đối tƣợng:
         Hàm xây dựng của lớp cha sẽ đƣợc gọi trƣớc
         Sau đó mới là hàm xây dựng của lớp con.
      Trong thừa kế, khi hủy bỏ đối tƣợng:
            Hàm hủy của lớp con sẽ đƣợc gọi trƣớc
            Sau đó mới là hàm hủy của lớp cha.
                   A


                   B



                   C
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ             7
     Chƣơng 9


   Hàm xây dựng và hàm hủy (tt)
     class SmartDir : public ContactDir {
          private:
             char *recent; // ten duoc tim gan nhat
                                                             Gọi hàm
          public:                                            xây dựng
             SmartDir(const int max) : ContactDir(max)      của lớp cha

                   { recent = 0; }
             SmartDir(const SmartDir& sd): ContactDir(sd)
                   { recent = 0; }
             ~SmartDir() {                                     Thu hồi vùng nhớ
                                                            của con trỏ thành viên
                     delete recent;                           của lớp con nếu đã
               }                                             cấp vùng nhớ trong
                                                                hàm xây dựng.
             // …………….
     };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                           8
      Chƣơng 9


       Thành viên lớp được bảo vệ
         Thừa kế:
           Có tất cả các dữ liệu và hàm thành viên.
           Không đƣợc truy xuất đến thành viên private.
         Thuộc tính truy cập protected:
                   Cho phép lớp con truy xuất.
                                                           class Foo {
 class ContactDir {                                             public:
      //...                                                   // cac thanh vien chung...
                                                                private:
        protected:                                            // cac thanh vien rieng...
              int     Lookup (const char *name);                protected:
                                                              // cac thanh vien duoc bao ve...
              Contact **contacts; // ds cac doi tac
                                                                public:
              int     dirSize;    // kich thuoc hien tai      // cac thanh vien chung nua...
              int maxSize;       // kich thuoc toi da           protected:
                                                              // cac thanh vien duoc bao ve nua...
 };                                                        };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                           9
     Chƣơng 9


 Lớp cơ sở riêng, chung và được bảo vệ
           Lớp cơ sở         Thừa kế public         Thừa kế private       Thừa kế protected
            private                   _                      _                      _
            public                 public                 private               protected
           protected             protected                private               protected

      class A {                              class B : A { // Thừa kế dạng private
           private:                               …….
                       int x;                  };
                       void Fx (void);       class C : private A { // A là lớp cơ sở riêng của B
                                                  ………
             public:                           };
                       int y;                class D : public A { // A là lớp cơ sở chung của C
                       void Fy (void);            ………
             protected:                        };
                       int z;                class E : protected A { // A: lớp cơ sở được bảo vệ
                       void Fz (void);            ……….
      };                                      };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                   10
      Chƣơng 9


                                       Đa thừa kế
      OptionList                    Window            class OptionList {           class Window {
                                                          public:                      public:
                                                             OptionList (int n);          Window (Rect &);
                                                             ~OptionList ();              ~Window (void);
                     Menu                                    //...                        //...
                                                      };                           };

                                                         class Menu
OptionList object   Window object       Menu object            : public OptionList, public Window {
   OptionList
                                                            public:
                       Window            OptionList
 data members
                    data members       data members              Menu (int n, Rect &bounds);
                                                                 ~Menu (void);
                                          Window
                                                                 //...
                                       data members      };

                                           Menu          Menu::Menu (int n, Rect &bounds) :
                                       data members
                                                             OptionList(n), Window(bounds)
                                                          { /* ... */ }
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                            11
     Chƣơng 9


       Sự mơ hồ trong đa thừa kế
        class OptionList {                     class Window {
            public:                                public:
               // ……                                  // ……
               void Highlight (int part);             void Highlight (int part);
         };                                     };

        class Menu : public OptionList,
                                               Hàm cùng tên                    Chỉ rõ hàm
                        public Window                                          của lớp nào
             { ……. };

                                                       void main() {
                      void main() {
     Gọi                                                   Menu m1(….);
                          Menu m1(….);        xử lý
     hàm                                                   m1.OptionList::Highlight(10);
   của lớp                m1.Highlight(10);
                                                           m1.Window::Highlight(20);
    nào ?                 ….
                                                           ….
                      }
                                                       }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                 12
      Chƣơng 9


                                Chuyển kiểu
      Có sẵn 1 phép chuyển kiểu không tƣờng minh:
         Đối tƣợng lớp cha = Đối tƣợng lớp con;
         Áp dụng cho cả đối tƣợng, tham chiếu và con trỏ.
                                                                                  m
            Menu      m(n, bounds);                  win
                                                                       OptionList data members
            Window    win = m;
                                                  Window
            Window    &wRef = m;               data members             Window data members
            Window    *wPtr = &menu;                                     Menu data members

      Không đƣợc thực hiện phép gán ngƣợc:
            Đối tƣợng lớp con = Đối tƣợng lớp cha; // SAI
                   Nếu muốn thực hiện
                                             class Menu : public OptionList, public Window {
                    phải tự định nghĩa
                                                 public:
                      phép ép kiểu                   //...
                                                     Menu (Window&);
                                             };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                   13
     Chƣơng 9


                                        Hàm ảo
       Liên kết tĩnh (static binding):
         Xác định khi biên dịch chƣơng trình.
         Dùng hàm thành viên.
         Gọi hàm của lớp cơ sở (lớp cha).
class ContactDir {                           class SortedDir : public ContactDir {
       //...                                     public:
    public:
                                                    SortedDir(const int max) : ContactDir(max) {}
       int Lookup (const char *name);
       //...                                         int Lookup(const char *name);
};                                           };

   void main() {                                 cout<<p->Lookup(“ABC”);
      ContactDir c1(10);                         ….                                  Gọi
      SortedDir *p; p = &c1;                 }                                       hàm
                                                                                    nào ?
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  14
     Chƣơng 9


                                  Hàm ảo (tt)
      Liên kết động (dynamic binding)
         Xác định khi thực thi chƣơng trình.
         Dùng hàm ảo (virtual function).
         Gọi hàm của lớp dẫn xuất (lớp con).
                                                                                   Gọi hàm
         Thể hiện tính đa hình của OOP.                                           của lớp
                                                                                    nào ?
   class ContactDir {                              void main() {
          //...                                       ContactDir c1(10);
       public:                                        SortedDir *p1; p1 = &c1;
          virtual int Lookup (const char *name);                                     Kết quả
   };                                                 cout<<p->Lookup(“ABC”);
                                                                                       trên
   class SortedDir : public ContactDir {               SortedDir c2(20);             màn hình
          //….                                         ContactDir *p2; p2 = &c2;
                                                                                      là gì?
       public:
           int Lookup(const char *name);               cout<<p->Lookup(“ABC”);
   };                                              }
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               15
     Chƣơng 9


                              Lớp cơ sở ảo
      Sự mơ hồ - dƣ thừa dữ liệu

            class OptionList
                 : public Widget, List
             { /*...*/ };
            class Window
                 : public Widget, Port
             { /*...*/ };
            class Menu
                : public OptionList,
                  public Window
             { /*...*/ };

                                             Đối tƣợng Menu

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                    16
     Chƣơng 9


                           Lớp cơ sở ảo (tt)
      Cách xử lý: dùng lớp cơ sở ảo.
      class OptionList
           : virtual public Widget,
             public List
       { /*...*/ };
      class Window
           : virtual public Widget,
                                                                             Chỉ có 1
             public Port                                                đối tượng Widget
       { /*...*/ };
      class Menu
          : public OptionList,
                                         Menu::Menu (int n, Rect &bounds) :
            public Window                     Widget(bounds), OptionList(n), Window(bounds)
       { /*...*/ };                       { //... }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               17
      Chƣơng 9


    Các toán tử được tái định nghĩa
      Tƣơng tự nhƣ tái định nghĩa hàm thành viên:
         Che giấu đi toán tử của lớp cơ sở.
         Hàm xây dựng sao chép:
            Y::Y (const Y&)
         Phép gán:
            Y& Y::operator = (const Y&)
      Nếu không định nghĩa, sẽ tự động có hàm xây
       dựng sao chép và phép gán do ngôn ngữ tạo ra.
        => SAI khi có con trỏ thành viên.
      Cẩn thận với toán tử new và delete.

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ           18
                                  BỔ SUNG

              MỘT SỐ VẤN ĐỀ KHÁC
              CẦN TỰ TÌM HIỂU THÊM



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ   19
     Bổ sung


                                        Stream
      Nhập xuất thông qua Stream (Dòng):
            Tổng quan về Stream.
            Đối tƣợng nhập xuất chuẩn.
            File.
            Nhập xuất với File đối tƣợng.
            Tái định nghĩa toán tử << với File.
            Tái định nghĩa toán tử >> với File.



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ         20
     Bổ sung


                                     Template
      Thiết kế lớp theo Template (mẫu):
         Thế nào là Template.
         Hàm template.
         Lớp template.
         Giới thiệu về STL
          (Standard Template Library).




Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ      21
     Bổ sung


                                    Exception
      Exception (Ngoại lệ):
            Ngoại lệ là gì?
            Đề xuất ngoại lệ - Nắm bắt ngoại lệ.
            Ngoại lệ trong C++.
            Cú pháp bắt ngoại lệ trong C++.
            Sử dụng ngoại lệ với Template.




Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ          22
     Bổ sung


                                    Container
      Container (Lớp vật chứa):
         Container là gì?
         Tại sao lại cần Container.
         Container trong C++.
         Một số Container trong 1 phiên bản của C++.




Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ          23
     Kết thúc chƣơng trình




                  CÂU HỎI?


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ   24

				
DOCUMENT INFO
Categories:
Tags: lieu
Stats:
views:12
posted:3/23/2011
language:Vietnamese
pages:24
Description: tai lieu hay