Bai 7- Ke Thua Va Da Xa

download Bai 7- Ke Thua Va Da Xa

of 10

Transcript of Bai 7- Ke Thua Va Da Xa

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    1/23

    TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

    Ngôn ngữ lập trình C và C++Bài 7: Kế thừa và Đa xạ

    TS. Đỗ Đăng Khoa

    Bộ môn Cơ học Ứng dụngViện Cơ khí

    http://chud-dhbkhn.blogspot.com/

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    2/23

    Khái niệm về Kế thừa

    Kế thừa cho phép định nghĩa một lớp mới từ một lớp khácnhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm củalớp cũ thay vì phải viết mới hoàn toàn

    Một lớp được kế thừa từ lớp khác được gọi là lớp dẫn xuất,hoặc lớp con

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuấtMột lớp có thể kế thừa từ một hoặc nhiều lớp cơ sởHàm dựng và hàm hủy không được phép kế thừa cho các lớp

    dẫn xuấtCon trỏ của lớp cơ sở có thể chứa được địa chỉ của các đối

    tượng của lớp dẫn xuất

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    3/23

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    4/23

    Khai báo lớp kế thừa đơn

    Cú pháp:class derived-class: access-specifier base-classTrong đó:

    derived-class: Tên lớp mớiaccess-specifier : Kiểu kế thừa là public, protected hoặc

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    base-class : Tên lớp đã có.Nếuaccess-specifier không sử dụng, thì mặc định là kếthừa private.

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    5/23

    Khai báo lớp kế thừa đơn

    Ví dụ: Lớp cơ sở Shape, và lớp dẫn xuất Rectangle.#include using namespace std;

    // Base classclass Shape{

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    void setWidth(int w){width = w;

    }void setHeight(int h){

    height = h;}

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    6/23

    Khai báo lớp kế thừa đơn

    protected :int width;int height;

    };// Derived class

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    public :

    int getArea(){return (width * height);

    }};

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    7/23

    Khai báo lớp kế thừa đơn

    int main(void){Rectangle Rect;

    Rect.setWidth(5);Rect.setHeight(7);

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    // Print the area of the object.cout

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    8/23

    Quyền truy cập

    Lớp dẫn xuất có thể truy cập tất cả các thành phần không phảiprivate

    Bảng tổng hợp các quyền truy cập

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    9/23

    Kiểu kế thừa

    Khi dẫn xuất một lớp từ lớp cơ sở, lớp cơ sở có thể được kếthừa theo public, protected và private

    Kế thừa public: tất cả thành phần public, protected của lớp cơsở sẽ là thành phần public, protected tương ứng của lớp dẫnxuất. Các thành phần private của lớp cơ sở không truy cập trực

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    ,thành phần public và protected của lớp cơ sở.

    Kế thừa protected: Các thành phần public, protected của lớpcơ sở sẽ là thành phần protected của lớp dẫn xuất.

    Kế thừa private: Các thành phần public, protected của lớp cơsở sẽ là thành phần private của lớp dẫn xuất

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    10/23

    Đa kế thừa

    Một lớp có thể kế thừa các thành phần từ nhiều lớp cơ sở,được khai báo như sau:class derived-class: access baseA, accessbaseB...access : là public, protected hoặc private.

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    ụ:#include

    using namespace std;// Base class Shapeclass Shape{public :

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    11/23

    Đa kế thừa

    void setWidth( int w){

    width = w;}void setHeight( int h)

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    height = h;}

    protected :int width;int height;

    };

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    12/23

    Đa kế thừa

    // Base class PaintCostclass PaintCost{

    public :int getCost( int area)

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    return area * 70;}

    };

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    13/23

    Đa kế thừa

    // Derived classclass Rectangle: public Shape, public PaintCost{

    public :int getArea()

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    return (width * height);

    }};

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    14/23

    Đa kế thừa

    int main( void ){Rectangle Rect; int area;Rect.setWidth(5);Rect.setHeight(7);

    area = Rect.getArea();

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    r n e area o e o ec .cout

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    15/23

    Đa xạ (polymorphism)

    Đa xạ thường xảy ra khi có một hệ thống phân cấp các lớp vàchúng có liên quan bởi việc kế thừa.

    Đa xạ có nghĩa là việc gọi tới một hàm thành phần sẽ làm cholàm cho một hàm khác được thực hiện tùy thuộc vào kiểu của đốitượng đó gọi hàm.

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    16/23

    Đa xạ (polymorphism)

    #include using namespace std;

    class Shape {protected :

    int width, height;

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    pu c :Shape( int a=0, int b=0){

    width = a;height = b;

    }

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    17/23

    Đa xạ (polymorphism)

    int area(){cout

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    18/23

    Đa xạ (polymorphism)

    class Triangle: public Shape{public :

    Triangle( int a=0, int b=0):Shape(a, b) { }int area (){

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    cou r ang e c ass area : en ;return (width * height / 2);

    }};

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    19/23

    Đa xạ (polymorphism)

    // Main function for the programint main( ){

    Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    s ore e a ress o ec ang eshape = &rec;// call rectangle area.shape->area();

    // store the address of Triangleshape = &tri;// call triangle area.

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    20/23

    Đa xạ (polymorphism)

    shape->area();return 0;}

    Kết quả in ra:Parent class areaParent class area

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    lớp cơ sở. Đây được gọi là liên kết tĩnh – hàm gọi được đã xácđịnh trước khi chương trình thực hiện

    Để giải quyết vấn đề, bổ sung thêm từ khóavirtual trướchàm area của lớp Shape:

    virtual int area()

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    21/23

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    22/23

    Hàm ảo (Virtual Function)

    Hàm ảo là hàm trong lớp cơ sở được khai báo sử dụng từ khóavirtual

    Việc định nghĩa một hàm ảo trong lớp cơ sở, một hàm tương tựtrong lớp dẫn xuất nhằm nói với trình biên dịch hàm này khôngđược liên kết tĩnh mà là liên kết động.

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    hủy

  • 8/19/2019 Bai 7- Ke Thua Va Da Xa

    23/23

    Hàm thuần ảo

    Hàm thuần ảo được khai báo như sau:virtual kiểu tên_hàm() = 0;

    Hàm thuần ảo không có thân hàmKhai báo hàm thuần ảo trong lớp cơ sở nhằm yêu cầu các lớp

    dẫn xuất từ lớp này bắt buộc phải có phần triển khai riêng hàm

    TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI

    .