Chuong 06 - Ke Thua

70
CHƯƠNG 6. KẾ THỪA ThS. Trần Anh Dũng

Transcript of Chuong 06 - Ke Thua

  • CHNG 6. K THA

    ThS. Trn Anh Dng

  • Ni dung

    14/09/2014 Lp trnh hng i tng 2

    Quan h gia cc lp i tng 1

    K tha 2

    K tha n 3

    Phm vi truy xut trong k tha 4

    a k tha 5 5

  • Quan h gia cc lp i tng

    Gia cc lp i tng c nhng loi quan

    h sau:

    Quan h mt mt (1-1)

    Quan h mt nhiu (1-n)

    Quan h nhiu nhiu (n-n)

    Quan h c bit ha, tng qut ha

    14/09/2014 Lp trnh hng i tng 3

  • Quan h mt mt (1-1)

    Khi nim: Hai lp i tng c gi l

    c quan h mt-mt vi nhau khi mt i

    tng thuc lp ny quan h vi mt i

    tng thuc lp kia v mt i tng thuc

    lp kia c quan h duy nht vi mt i

    tng thuc lp ny.

    K hiu:

    14/09/2014 Lp trnh hng i tng 4

    ClassA ClassB Quan h

  • Quan h mt mt (1-1)

    V d:

    14/09/2014 Lp trnh hng i tng 5

    LOPHOC GIAOVIEN Ch nhim

    VO CHONG Hn nhn

    COUNTRY CAPITAL C

  • Quan h mt nhiu (1-n)

    Khi nim: Hai lp i tng c gi l

    c quan h mt-nhiu vi nhau khi mt i

    tng thuc lp ny quan h vi nhiu i

    tng thuc lp kia v mt i tng lp

    kia c quan h duy nht vi mt i tng

    thuc lp ny.

    K hiu:

    14/09/2014 Lp trnh hng i tng 6

    ClassA ClassB Quan h

  • Quan h mt nhiu (1-n)

    V d:

    14/09/2014 Lp trnh hng i tng 7

    LOPHOC HOCSINH C

    CONGTY NHANVIEN C

    HOASI TACPHAM Sng tc

  • Quan h nhiu nhiu (n-n)

    Khi nim: hai lp i tng c gi l

    quan h nhiu-nhiu vi nhau khi mt i

    tng thuc lp ny c quan h vi nhiu

    i tng thuc lp kia v mt i tng

    lp kia cng c quan h vi nhiu i

    tng thuc lp ny.

    K hiu

    14/09/2014 Lp trnh hng i tng 8

    ClassA ClassB Quan h

  • Quan h nhiu nhiu (n-n)

    V d

    14/09/2014 Lp trnh hng i tng 9

    NAM NU Yu

    BACSI BENHNHAN Khm bnh

  • Quan h c bit ha tng qut ha

    Khi nim: hai lp i tng c gi l

    c quan h c bit ha-tng qut ha vi

    nhau khi lp i tng ny l trng hp

    c bit ca lp i tng kia v lp i

    tng kia l trng hp tng qut ca lp

    i tng ny.

    K kiu:

    14/09/2014 Lp trnh hng i tng 10

    ClassA

    ClassB

  • Quan h c bit ha tng qut ha

    V d:

    14/09/2014 Lp trnh hng i tng 11

    TAMGIAC

    TAMGIACCAN

    NGUOI

    SINHVIEN

  • Quan h c bit ha tng qut ha

    14/09/2014 Lp trnh hng i tng 12

    Triangle

    Polygon

    Animal

    Cat Horse Chicken

    TerrestrialAnimal AquaticAnimal

    Fish Octopus

    Rectangle

  • K tha

    K tha l mt c im ca ngn ng dng

    biu din mi quan h c bit ha tng qut

    ha gia cc lp. Cc lp c tru tng ha

    v c t chc thnh mt s phn cp lp.

    S k tha l mt mc cao hn ca tru tng

    ha, cung cp mt c ch gom chung cc lp c

    lin quan vi nhau thnh mt mc khi qut ha

    c trng cho ton b cc lp ni trn.

    14/09/2014 Lp trnh hng i tng 13

  • K tha

    Cc lp vi cc c im tng t nhau c th

    c t chc thnh mt s phn cp k tha

    (cy k tha).

    Quan h l 1: K tha c s dng thng

    dng nht biu din quan h l 1.

    Mt sinh vin l mt ngi

    Mt hnh trn l mt hnh ellipse

    Mt tam gic l mt a gic

    14/09/2014 Lp trnh hng i tng 14

  • Li ch k tha

    K tha cho php xy dng lp mi t lp c.

    K tha cho php t chc cc lp chia s m

    chng trnh chung, nh vy c th d dng sa

    cha, nng cp h thng.

    Trong C++, k tha cn nh ngha s tng

    thch, nh ta c c ch chuyn kiu t ng.

    14/09/2014 Lp trnh hng i tng 15

  • c tnh K tha

    14/09/2014 Lp trnh hng i tng 16

    Cho php nh ngha lp mi t lp c.

    Lp mi gi l lp con (subclass) hay lp dn xut

    (derived class)

    Lp c gi l lp cha (superclass) hay lp c s

    (base class).

  • c tnh K tha

    Tha k cho php:

    Nhiu lp c th dn xut t mt lp c s

    Mt lp c th l dn xut ca nhiu lp c s

    Tha k khng ch gii hn mt mc: Mt lp

    dn xut c th l lp c s cho cc lp dn xut

    khc

    14/09/2014 Lp trnh hng i tng 17

    Animal

    Cat Horse Chicken

    TerrestrialAnimal AquaticAnimal

    Fish Octopus

  • C php khai bo k tha

    class SuperClass{

    //Thnh phn ca lp c s

    };

    class DerivedClass : public/protected/private

    SusperClass{

    //Thnh phn b sung ca lp dn xut

    };

    14/09/2014 Lp trnh hng i tng 18

  • Truy cp thnh vin ca lp

    14/09/2014 Lp trnh hng i tng 19

  • K tha n

    Xt hai khi nim Ngi v Sinh vin vi mi

    quan h t nhin: Mt Sinh vin l mt Ngi.

    Trong C++, ta c th biu din khi nim trn,

    mt sinh vin l mt ngi c thm mt s thng

    tin v mt s thao tc (ring bit ca sinh vin).

    Nh vy, ta t chc lp Sinh vin k tha t lp

    Ngi.

    14/09/2014 Lp trnh hng i tng 20

  • K tha n

    Ta c th t chc hai lp Nam sinh v N sinh l

    hai lp con (lp dn xut) ca lp Sinh vin.

    Trng hp ny, lp Sinh vin tr thnh lp cha

    (lp c s) ca hai lp trn.

    14/09/2014 Lp trnh hng i tng 21

    NGI

    GING VIN SINH VIN

    NAM SINH N SINH

  • K tha n V d

    14/09/2014 Lp trnh hng i tng 22

    class Nguoi {

    char *HoTen;

    int NamSinh;

    public:

    Nguoi();

    Nguoi( char *ht, int ns):NamSinh(ns) {HoTen=strdup(ht);}

    ~Nguoi() {delete [ ] HoTen;}

    void An() const { cout

  • K tha n V d

    14/09/2014 Lp trnh hng i tng 23

    class SinhVien : public Nguoi {

    char *MaSo;

    public:

    SinhVien();

    SinhVien( char *ht, char *ms, int ns) : Nguoi(ht,ns) {

    MaSo = strdup(ms);

    }

    ~SinhVien() {

    delete [ ] MaSo;

    }

    void Xuat() const;

    };

  • K tha n V d

    14/09/2014 Lp trnh hng i tng 24

    void Nguoi::Xuat() const

    {

    cout

  • K tha n V d

    14/09/2014 Lp trnh hng i tng 25

    void main() {

    Nguoi p1("Le Van Nhan",1980);

    SinhVien s1("Vo Vien Sinh", "200002541",1984);

    cout

  • K tha c tnh ca lp cha

    Khai bo

    class SinhVien : public Nguoi {

    //...

    };

    Cho bit lp Sinh vin k tha t lp Ngi. Khi

    Sinh vin tha hng cc c tnh ca lp Ngi.

    V mt d liu: Mi i tng Sinh vin t ng

    c thnh phn d liu h tn, nm sinh ca

    ngi.

    14/09/2014 Lp trnh hng i tng 26

  • K tha c tnh ca lp cha

    V mt thao tc: Lp Sinh vin c t ng k

    tha cc thao tc ca lp cha. y chnh l kh

    nng s dng li m chng trnh.

    Ring phng thc thit lp khng c k

    tha.

    Kh nng tha hng cc thao tc ca lp c s

    c th c truyn qua v hn mc.

    14/09/2014 Lp trnh hng i tng 27

  • nh ngha li thao tc lp con

    Ta c th nh ngha li cc c tnh lp con

    c lp cha, vic nh ngha ch yu l thao tc.

    14/09/2014 Lp trnh hng i tng 28

    class SinhVien : public Nguoi {

    char *MaSo;

    public:

    //...

    void Xuat() const;

    };

    void SinhVien::Xuat() const {

    cout

  • Rng buc ng ngha lp con

    C th p dng quan h k tha mang ngha

    rng buc, i tng lp con l i tng

    lp cha nhng c d liu b rng buc:

    Hnh trn l Ellipse vi rng buc bn knh ngang dc

    bng nhau.

    S o l s phc vi rng buc phn o bng 0

    Lp s o sau y l mt v d minh ha.

    14/09/2014 Lp trnh hng i tng 29

  • V d

    14/09/2014 Lp trnh hng i tng 30

    class Complex {

    friend ostream& operator

  • V d

    14/09/2014 Lp trnh hng i tng 31

    class Imag: public Complex {

    public:

    Imag(double i = 0):Complex(0, i){ }

    Imag(const Complex &c) : Complex(0, c.im){ }

    Imag& operator = (const Complex &c){

    re = 0; im = c.im;

    return *this;

    }

    double Norm() const {

    return fabs(im);

    }

    };

  • V d

    14/09/2014 Lp trnh hng i tng 32

    void main()

    {

    Imag i = 1;

    Complex z1(1,1)

    Complex z3 = z1 - i; // z3 = (1,0)

    i = Complex(5,2); // i la so ao (0,2)

    Imag j = z1; // j la so ao (0,1)

    cout

  • Rng buc ng ngha lp con

    Trong v d trn, lp s o (Imag) k tha hu

    ht cc thao tc ca lp s phc (Complex).

    Tuy nhin, ta mun rng buc mi i tng

    thuc lp s o u phi c phn thc bng 0. V

    vy, phi nh ngha li cc hm thnh phn c

    th vi phm iu ny.

    V d php ton gn phi c nh ngha li

    m bo rng buc ny.

    14/09/2014 Lp trnh hng i tng 33

  • Phm vi truy xut

    Khi thit lp quan h k tha, ta vn phi

    quan tm n tnh ng gi v che du

    thng tin.

    iu ny nh hng n phm vi truy xut

    ca cc thnh phn ca lp.

    Hai vn c t ra l:

    Truy xut theo chiu dc Truy xut theo chiu ngang

    14/09/2014 Lp trnh hng i tng 34

  • Phm vi truy xut

    Truy xut theo chiu dc:

    Hm thnh phn ca lp con c quyn truy

    xut cc thnh phn ca lp cha hay khng?

    Truy xut theo chiu ngang:

    Cc thnh phn ca lp cha, sau khi k tha

    xung lp con, th th gii bn ngoi c quyn

    truy xut thng qua i tng ca lp con hay

    khng?

    14/09/2014 Lp trnh hng i tng 35

  • Truy xut theo chiu dc

    Lp con c quyn truy xut cc thnh phn

    ca lp cha hay khng, hon ton do lp

    cha quyt nh. iu c xc nh

    bng thuc tnh k tha.

    Trong trng hp lp Sinh vin k tha lp

    Ngi, Sinh vin c quyn truy xut h tn ca

    chnh mnh (c khai bo lp Ngi) hay

    khng?

    14/09/2014 Lp trnh hng i tng 36

  • Phm vi truy xut

    14/09/2014 Lp trnh hng i tng 37

    class A{

    private:

    int a;

    void f();

    protected:

    int b;

    void g();

    public:

    int c;

    void h();

    };

    void A::f()

    {

    a = 1; b = 2; c = 3;

    }

    void A::g()

    {

    a = 4; b = 5; c = 6;

    }

    void A::h(){

    a = 7; b = 8; c = 9;

    }

  • Phm vi truy xut

    14/09/2014 Lp trnh hng i tng 38

    void main()

    {

    A x;

    x.a = 10;

    x.f();

    V d: Cho bit trong on chng trnh

    sau cu lnh no ng, cu lnh no sai.

    x.b = 20;

    x.g();

    x.c = 30;

    x.h();

    }

  • Phm vi truy xut

    Thuc tnh public:

    Thnh phn no c thuc tnh public th c th truy

    xut t bt c ni no.

    Thuc tnh private: Thnh phn c thuc tnh

    private

    L ring t ca lp

    Ch c hm thnh phn ca lp v ngoi l cc hm

    bn c php truy xut.

    Cc lp con cng khng c quyn truy xut

    14/09/2014 Lp trnh hng i tng 39

  • Phm vi truy xut

    Thuc tnh protected:

    Cho php qui nh mt vi thnh phn no ca lp

    l bo mt, theo ngha th gii bn ngoi khng c

    php truy xut, nhng tt c cc lp con, chu u

    c php truy xut.

    14/09/2014 Lp trnh hng i tng 40

  • V d Thuc tnh private

    14/09/2014 Lp trnh hng i tng 41

    class Nguoi {

    char *HoTen;

    int NamSinh;

    public:

    //...

    };

    class SinhVien : public Nguoi {

    char *MaSo;

    public:

    //...

    void Xuat() const;

    };

  • Thuc tnh private

    Trong v d trn, khng c hm thnh phn no

    ca lp SinhVien c th truy xut cc thnh phn

    HoTen, NamSinh ca lp Nguoi.

    V d, on chng trnh sau y s gy ra li:

    void SinhVien::Xuat() const {

    cout

  • Thuc tnh private

    Ta c th khc phc li trn nh khai bo lp

    SinhVien l bn ca lp Nguoi nh trong v d

    ban u:

    14/09/2014 Lp trnh hng i tng 43

    class Nguoi {

    friend class SinhVien;

    char *HoTen;

    int NamSinh;

    public:

    //...

    };

  • Thuc tnh private

    Khai bo lp bn nh trn, lp SinhVien c th

    truy xut cc thnh phn private ca lp Nguoi.

    Cch lm trn ch gii quyt c nhu cu ca

    ngi s dng khi mun to lp con c quyn

    truy xut cc thnh phn d liu private ca lp

    cha.

    Tuy nhin, cn phi sa li lp cha v tt c cc

    lp cp cao hn mi khi c mt lp con mi.

    14/09/2014 Lp trnh hng i tng 44

  • Thuc tnh private

    14/09/2014 Lp trnh hng i tng 45

    class Nguoi {

    friend class SinhVien;

    friend class NuSinh;

    char *HoTen; int NamSinh;

    public:

    //...

    void An() const { cout

  • Thuc tnh protected

    Trong v d trc, khi ci t lp NuSinh ta phi

    thay i lp cha SinhVien v c lp c s Nguoi

    mc cao hn.

    14/09/2014 Lp trnh hng i tng 46

    class Nguoi {

    protected:

    char *HoTen;

    int NamSinh;

    public:

    //...

    };

  • Thuc tnh protected

    14/09/2014 Lp trnh hng i tng 47

    class SinhVien : public Nguoi {

    protected:

    char *MaSo;

    public:

    SinhVien(char *ht, char *ms, int ns) : Nguoi(ht,ns){

    MaSo = strdup(ms);

    }

    ~SinhVien(){

    delete [ ] MaSo;

    }

    void Xuat() const;

    };

  • Thuc tnh protected

    14/09/2014 Lp trnh hng i tng 48

    class NuSinh : public SinhVien {

    public:

    NuSinh(char *ht, char *ms, int ns) : SinhVien(ht,ms,ns){

    }

    void An() const {

    cout

  • Thuc tnh protected

    14/09/2014 Lp trnh hng i tng 49

    void Nguoi::Xuat() const {

    cout

  • Thuc tnh protected

    L cch trnh phi sa i lp c s khi c

    lp con mi hnh thnh m bo tnh ng gi.

    Thng thng ta dng thuc tnh protected cho

    thnh phn d liu v public cho thnh phn

    phng thc.

    Tm ti, thnh phn c thuc tnh protected ch

    cho php nhng lp con k tha c php s

    dng.

    14/09/2014 Lp trnh hng i tng 50

  • Truy xut theo chiu ngang

    Thnh phn protected v public ca lp khi k

    tha xung lp con th th gii bn ngoi c

    quyn truy xut thng qua i tng thuc lp

    con hay khng?

    iu ny hon ton do lp con quyt nh

    bng phm vi k tha: K tha public, K tha

    protected, K tha private

    14/09/2014 Lp trnh hng i tng 51

  • Phm vi truy xut trong k tha

    14/09/2014 Lp trnh hng i tng 52

    private

    private private private

    protected

    protected protected protected

    public

    public public public

    D1: public B D3: protected B

    D2: private B

  • Phm vi truy xut trong k tha

    14/09/2014 Lp trnh hng i tng 53

    private Protected public

    private ? ? ?

    protected ? ? ?

    public ? ? ?

    Type of Inheritance

    Acce

    ss C

    on

    trol fo

    r Mem

    bers

  • Phm vi truy xut trong k tha

    14/09/2014 Lp trnh hng i tng 54

    Type of inheritance Base class member access specifier

    public

    inheritance protected

    inheritance private

    inheritance

    Public

    public in derived class.

    Can be accessed directly by any

    non-static member functions,

    friend functions and non-

    member functions.

    protected in derived class.

    Can be accessed directly by all

    non-static member functions

    and friend functions.

    private in derived class.

    Can be accessed directly by all

    non-static member functions

    and friend functions.

    Protected

    protected in derived class.

    Can be accessed directly by all

    non-static member functions

    and friend functions.

    protected in derived class.

    Can be accessed directly by all

    non-static member functions

    and friend functions.

    private in derived class.

    Can be accessed directly by all

    non-static member functions

    and friend functions.

    Private

    Hidden in derived class.

    Can be accessed by non-static

    member functions and friend

    functions through public or

    protected member functions

    of the base class.

    Hidden in derived class.

    Can be accessed by non-static

    member functions and friend

    functions through public or

    protected member functions

    of the base class.

    Hidden in derived class.

    Can be accessed by non-static

    member functions and friend

    functions through public or

    protected member functions

    of the base class.

  • V d 1

    14/09/2014 Lp trnh hng i tng 55

    mother

    daughter son

    class mother{

    protected:

    int x, y;

    public:

    void set(int a, int b);

    private:

    int z;

    };

    class daughter : public mother{

    private:

    double a;

    public:

    void foo ( );

    };

    void daughter :: foo ( ){

    x = y = 20;

    set(5, 10);

    cout

  • V d 2

    14/09/2014 Lp trnh hng i tng 56

    mother

    daughter son

    class mother{

    protected:

    int x, y;

    public:

    void set(int a, int b);

    private:

    int z;

    };

    class son : private mother{

    private:

    double b;

    public:

    void foo ( );

    };

    void son :: foo ( ){

    x = y = 20;

    set(5, 10);

    cout

  • Phng thc thit lp

    Phng thc thit lp ca lp c s lun lun

    c gi mi khi c mt i tng ca lp dn

    xut c to ra.

    Nu mi phng thc thit lp ca lp c s u

    i hi phi cung cp tham s th lp con bt

    buc phi c phng thc thit lp cung cp

    cc tham s

    14/09/2014 Lp trnh hng i tng 57

  • Phng thc thit lp

    V d 1:

    14/09/2014 Lp trnh hng i tng 58

    class A {

    public:

    A ( )

    { cout

  • Phng thc thit lp

    V d 2:

    14/09/2014 Lp trnh hng i tng 59

    class A {

    public:

    A ( )

    { cout

  • nh ngha cc thnh phn ring

    Ngoi cc thnh phn c k tha, lp dn

    xut c th nh ngha thm cc thnh phn ring

    14/09/2014 Lp trnh hng i tng 60

    class HinhTron : Diem {

    double r;

    public:

    HinhTron( double tx, double ty, double rr) : Diem(tx, ty){

    r = rr;

    }

    void Ve(int color) const;

    void TinhTien( double dx, double dy) const;

    };

    HinhTron t(200,200,50);

  • nh ngha cc thnh phn ring

    Lp dn xut cng c th override cc phng

    thc c nh ngha trong lp cha.

    14/09/2014 Lp trnh hng i tng 61

    class A {

    protected:

    int x, y;

    public:

    void print (){

    cout

  • Truy cp phng thc

    14/09/2014 Lp trnh hng i tng 62

    class Point{

    protected:

    int x, y;

    public:

    void set(int a, int b)

    { x=a; y=b; }

    void foo ();

    void print();

    };

    class Circle : public Point{

    private: double r;

    public:

    void set (int a, int b, double c) {

    Point ::set(a, b); //same name function call

    r = c;

    }

    void print() { //.. }

    };

    Circle C;

    C.set(10,10,100); ???

    C.foo (); ???

    C.print(); ???

    Point A;

    A.set(30,50); ???

    A.print();

  • Phng thc hy b

    Khi mt i tng b hy i, phng thc hy b

    ca n s c gi. Sau , cc phng thc

    hy b ca lp c s s c gi mt cch t

    ng.

    V vy, lp con khng cn v cng khng c

    thc hin cc thao tc dn dp cho cc thnh

    phn thuc lp cha.

    14/09/2014 Lp trnh hng i tng 63

  • Phng thc hy b - V d

    14/09/2014 Lp trnh hng i tng 64

    class SinhVien : public Nguoi {

    char *MaSo;

    public:

    SinhVien( char *ht, char *ms, int ns) : Nguoi(ht,ns){ MaSo = strdup(ms);

    }

    SinhVien(const SinhVien &s) : Nguoi(s){

    MaSo = strdup(s.MaSo);

    }

    ~SinhVien() {delete [ ] MaSo;}

    //...

    };

  • Con tr v k tha

    Con tr trong k tha hot ng theo nguyn tc

    sau:

    Con tr tr n i tng thuc lp c s th c th tr

    n cc i tng thuc lp con.

    Nhng con tr tr n i tng thuc lp con th

    khng th tr n cc i tng thuc lp c s.

    C th p kiu con tr tr n i tng thuc lp

    con c th tr n i tng thuc lp c s. Tuy

    nhin thao tc ny c th nguy him.

    14/09/2014 Lp trnh hng i tng 65

  • a k tha

    a k tha cho php mt lp c th l dn xut

    ca nhiu lp c s.

    class A : public B, public C {

    };

    Cc c im ca k tha n vn ng cho

    trng hp a k tha.

    14/09/2014 Lp trnh hng i tng 66

  • a k tha

    Lm th no biu th tnh c lp ca cc thnh

    phn cng tn bn trong mt lp dn xut?

    Cc phng thc thit lp v hy b c gi

    nh th no: th t, truyn thng tin, ?

    Lm th no gii quyt tnh trng tha k xung

    t trong , lp D dn xut t B v C, v c hai

    cng l dn xut ca A

    14/09/2014 Lp trnh hng i tng 67

  • a k tha V d

    14/09/2014 Lp trnh hng i tng 68

    class BASE_A{

    public:

    int a;

    int f( ){

    return 0;

    }

    int g( ){

    return 0;

    }

    int h( ) { return 0;}

    };

    class BASE_B

    {

    public:

    int a;

    int f( ){

    return 0;

    }

    int g( ){

    return 0;

    }

    };

  • a k tha V d

    14/09/2014 Lp trnh hng i tng 69

    class ClassC : public BASE_A, public BASE_B{

    //

    };

    void main(){

    ClassC C;

    C.f = g; //Li m h

    C.a = 1; //Li m h

    C.g(); //Li m h

    C.h();

    }

  • Q & A