You are on page 1of 18

Bi 9: K tha

(Inheritance)

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Khi nim
qun l nhn s ca cng ty, ta c th nh ngha cc lp tng ng vi
cc v tr lm vic ca cng ty:

class Worker {
private:
string name;
float salary;
int level;
public:
string getName() {...}
void pay() {...}
void doWork() {...}
...
};

class Manager {
private:
string name;
float salary;
int dept;
public:
string getName() {...}
void pay() {...}
void doWork() {...}
...
};

class Director {
private:
string name;
float salary;
public:
string getName() {...}
void pay() {...}
void doWork() {...}
...
};

C 3 lp trn u c nhng bin v hm ging ht nhau v ni dung to


ra mt lp Employee cha cc thng tin chung s dng li

S dng li code

Gim s code cn vit

D bo tr, sa i v sau

R rng hn v mt logic trong thit k chng trnh


EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Khi nim (tip)


Lp m
(hay lp c s)
Cc lp con
(hay lp dn xut)

Worker

Employee

Manager

Director

Hai hng tha k:

C th ho: lp con l mt trng hp ring ca lp m (nh v d trn)


Tng qut ho: m rng lp m (vd: Point2D thm bin z thnh Point3D)

K tha cho php cc lp con s dng cc bin v phng thc


ca lp m nh ca n, tr cc bin v phng thc private
K tha vi public v private:

public: cc thnh phn public ca lp m vn l public trong lp con


private: ton b cc thnh phn ca lp m tr thnh private ca lp con
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

K tha public
class Employee {
private:
string name;
float salary;
public:
...
string getName() {...}
void pay() {...}
};
class Worker : public Employee {
private:
int level;
public:
...
void doWork() {...}

void show() {
cout << getName()
<< salary; // li
}
};
Worker w;
w.getName();
w.doWork();
w.pay();
w.salary = 10; // li
w.show();
Employee e = w; // OK
Worker w2 = e;
// li
Worker w3 = (Worker)e; // li

Cc thnh phn public ca lp m vn l public trong lp con


Lp con chuyn kiu c thnh lp m, nhng ngc li khng c

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

K tha private
class LinkedList {
private:
...
public:
void insertTail(int
void insertHead(int
void deleteHead() {
void deleteTail() {
int getHead() { ...
int getTail() { ...
...
};

x) { ... }
x) { ... }
... }
... }
}
}

class Stack : private LinkedList {


public:
void push(int x)
{ insertHead(x); }

int pop() {
int x = getHead();
deleteHead();
return x;
}
...
};
Stack s;
s.push(10);
s.push(20);
s.pop();
s.insertTail(30); // li
s.getTail();
// li

Tt c cc thnh phn ca lp m u tr thnh private ca lp con

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Thnh phn protected


Ngoi public v private, cn c cc thnh phn protected: c th
c s dng bi cc phng thc trong lp dn xut t n, nhng
khng s dng c t ngoi cc lp

class Employee {
protected:
string name;
float rate;
int hours;
int getSalary()
{ return rate*hours; }
public:
void setName(const char* s)
{ name = s; }
string getName()
{ return name; }
void pay() { ... }
...
};
6

class Worker: public Employee {


public:
void doWork() { ... }
void print() {
cout << "Ten: " << name
<< "Luong: " << getSalary();
}
...
};
Worker w;
w.doWork();
w.pay();
w.print();
w.name = "NV Tung";
// li
cout << w.getSalary(); // li
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Tng kt cc kiu k tha


Kiu k tha

Phm vi

private

protected

public

private

(khng)

(khng)

(khng)

protected

private

protected

protected

public

private

protected

public

Ct: cc kiu k tha


Hng: phm vi cc bin/phng thc thnh phn trong lp m

Kt qu: phm vi cc bin/phng thc trong lp dn xut

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Constructor v destructor trong k tha


Constructor v destructor khng c cc lp con tha k
Mi constructor ca lp dn xut phi gi mt constructor ca lp
m, nu khng s c ngm hiu l gi constructor mc nh

class Pet {
public:
Pet() {...}
Pet(string name) {...}
};
class Dog: public Pet {
public:
Dog() {...} // Pet()
Dog(string name): Pet(name) {...}
};

class Bird {
public:
Bird(bool canFly) {...}
};
class Eagle: public Bird {
public:
// sai: Eagle() {...}
Eagle(): Bird(true) {...}
};

Destructor ca cc lp s c gi t ng theo th t ngc t


lp dn xut ti lp c s

~Dog() ~Pet()
~Eagle() ~Bird()
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Gi cons ca lp m trong cons ca lp con


Khng th gi cons ca lp m trong cons ca lp con nh hm, m
phi gi danh sch khi to

class Point3D: private Point2D {


protected:
float z;
public:
Point3D(): Point2D(0., 0.), z(0.) // ng
{ ... }
Point3D(double x, double y, double z)
// gi cons mc nh Point2D()
{
Point2D(x, y); // sai: to i tng Point2D tm
this->z = z;
};
...
};
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Phng thc o (virtual method)

L phng thc c khai bo lp m, nhng c th c nh


ngha li (thay th) cc lp dn xut

class Shape {
void main() {
public:
Circle c;
virtual void draw()
Shape s1 = c;
{ cout<<"Shape::draw\n"; }
Shape& s2 = c;
Kt qu chy:
void erase()
Shape* s3 = &c;
Circle::erase
}
bt buc { cout<<"Shape::erase\n";
Circle::draw
void redraw()
c.draw();
Shape::erase c.erase();
{ erase(); draw(); }
s1.erase();
s1.draw();
Shape::draw
};
s2.draw();
Shape::erase s2.erase();
Circle::draw s3->erase(); s3->draw();
c th b
class Circle: public Shape {Shape::erase
public:
Circle::draw c.redraw();
Shape::erase s1.redraw();
virtual void draw()
Circle::draw
{ cout<<"Circle::draw\n";
}
s2.redraw();
Shape::erase s3->redraw();
void erase()
Shape::draw
{ cout<<"Circle::erase\n";
}
}
Shape::erase
};
10

Circle::draw
Shape::erase
Circle::draw

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Lp tru tng (abstract class)

Phng thc o thun tu (pure virtual method): l phng thc


c khai bo nhng cha c nh ngha cn c nh ngha
trong cc lp dn xut
Lp tru tng l lp c phng thc o thun tu

Khng th to c i tng t lp tru tng

class Shape {
public:
virtual void draw() = 0;
virtual void erase() = 0;
virtual void area() = 0;
void redraw() { ... }
};
class Circle: public Shape {
public:
...
virtual void draw() { ... }
virtual void erase() { ... }
11

virtual void area() { ... }


};
Shape p;

// li

Circle c;
Shape p2 = c;
Shape& p3 = c;
Shape* p4 = &c;

// li
// OK
// OK

void func(Shape s) {...} // li


void func(Shape& s) {...} // OK
void func(Shape* s) {...} // OK
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Tnh a hnh (polymorphism)

Tha k v nh ngha cc hm o gip qun l i tng d dng


hn: c th gi ng phng thc m khng cn quan tm ti lp
thc s ca n l g (trong C phi dng switch hoc con tr hm)

class Pet {
public:
virtual void say() = 0;
};
class Cat: public Pet {
public:
virtual void say()
{ cout << "miao\n"; }
};
class Dog: public Pet {
public:
virtual void say()
{ cout << "gruh\n"; }
};
12

Pet* p[3] = {
new Dog(), new Cat(), new Cat() };
for (int i=0; i<3; i++)
p[i]->say();
// ...
// Th ny khng c:
// Pet p2[2] = { Dog(), Cat() };
// ...

Kt qu chy:
gruh
miao
miao
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Destructor o
class ClassA {
public:
ClassA() { ... }
~ClassA() { ... }
};

class ClassA {
public:
ClassA() { ... }
virtual ~ClassA() { ... }
};

class ClassB: public ClassA {


public:
ClassB() { ... }
~ClassB() { ... }
};

class ClassB: public ClassA {


public:
ClassB() { ... }
virtual ~ClassB() { ... }
};

ClassB* b = new ClassB;


ClassA* a = (ClassA*)new ClassB;

ClassB* b = new ClassB;


ClassA* a = (ClassA*)new ClassB;

delete b;
delete a;

delete b;
delete a;

// ~ClassB, ~ClassA
// ~ClassA

// ~ClassB, ~ClassA
// ~ClassB, ~ClassA

Nn lun khai bo destructor o nu khng c g c bit


13

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Biu din trong b nh


#pragma pack(1)

class V3: public V2 {


public:

double z;

void f3();
virtual void fv2();
virtual void fv3();
};

V3 v3;
V2& v2 = v3;

14

vtable

vtable
fv2()
fv3()
V3

Kt qu chy:
1245000 20
1245000 28
1245004 1245012 1245020

Thnh Kch
phn thc
V2

class V2 {
public:
double x, y;
static int i;
void f2();
virtual void fv2();
};

printf("%d %d\n", &v2, sizeof(v2));


printf("%d %d\n", &v3, sizeof(v3));
printf("%d %d %d\n", &v3.x, &v3.y, &v3.z);

D liu static khng nm trong i tng


Nu lp c phng thc o, thm mt con tr
(vtable) ti mt bng cc phng thc o
phng thc o tng t nh con tr hm
D liu ca lp con s c ni tip vo sau
d liu ca lp m
Ch vic chnh bin d liu (data alignment)
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

a k tha (k tha nhiu lp)

C++ cho php mt lp c th k tha t nhiu lp khc nhau

class Camera {
public:
void takePicture();
...
};
class FMDevice {
public:
void turnOn();
void turnOff();
void setFreq(float f);
...
};
class Phone {
public:
void call(string num);
...
};
15

class CellPhone:
public Camera,
protected FMDevice,
public Phone
{
public:
void turnFMOn();
void turnFMOff();
void setFMFreq(float f);
...
};

CellPhone p;
p.takePicture();
p.turnOn();
// li
p.turnFMOn();
p.call("0912345678");
EE3490: K thut lp trnh HK1 2013/2014
TS. o Trung Kin H Bch khoa H Ni

Thnh phn trng tn


class Legged {
public:
void move() { ... }
};
class Winged {
public:
void move() { ... }
};
class Pigeon: public Legged,
public Winged {
...
};
Pigeon p1;
p1.move();

// li

p1.Legged::move();
p1.Winged::move();
((Legged&)p1).move();
((Winged&)p1).move();

//
//
//
//

Legged
Winged
Legged
Winged

class Penguin: public Legged,


public Winged {
public:
void move() { Legged::move(); }
...
};
Penguin p2;
p2.move();
// Penguin
((Legged&)p2).move(); // Legged
((Winged&)p2).move(); // Winged

a k tha c th khin chng trnh tr nn rt phc tp v kh kim sot


cc bin/phng thc thnh phn ch nn s dng khi thc s cn thit
16

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Biu din a k tha trong b nh


class B1 {...}
class B2 {...}
class D: public B1, public B2 {...}

class B1
double a, b;
virtual void fb1();

D d;
B1& b1 = d;
B2& b2 = d;
printf("%d %d\n", &d, sizeof(d));
printf("%d %d\n", &b1, sizeof(b1));
printf("%d %d\n", &b2, sizeof(b2));

17

fb1()

vtable

fd()

vtable

vtable

fb2()

B2

Cc thnh phn ca cc lp c s
nm ni tip nhau trong b nh
Lp k tha o: t tm hiu thm

vtable

Thnh Kch
phn thc

class D
float d;
virtual void fb1();
virtual void fb2();
virtual void fd();

B1

Kt qu chy:
1244996 32
1244996 20
1245016 8

class B2
int c;
virtual void fb2();

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

Bi tp
1.

nh ngha kiu struct Shape trong C ri vit cc hm draw(), area() tu


theo dng hnh: trn, vung, ch nht. Dng hai cch lm: dng switch,
con tr hm. So snh vi cch lm trong C++.

2.

Vi iu kin no th c th lu mt i tng ra file ri c li trong ln


chy sau nh di y? Gii thch v chy th.

ln chy trc: fwrite((void*)&obj, 1, sizeof(obj), file);

ln chy sau:

fread((void*)&obj, 1, sizeof(obj), file);

3.

Vit cc lp Shape (tru tng) v Circle, Square, Rectangle, Ellipse,


Sphere. Hy thit k vic k tha sao cho hp l.

4.

Hon tt cc lp Employee, Worker, Manager, Director v vit mt chng


trnh th.

5.

M rng v sa bi tp trn:

Thm lp Company cha ton b cc nhn vin

Thm quan h v cng vic gia cc nhn vin. VD: mi Worker c 1 Manager,...

Vit cc lp B1, B2 v D trong phn a k tha ri kim tra kch thc cc


kiu v a ch cc thnh phn so vi a ch ca i tng.

6.

18

EE3490: K thut lp trnh HK1 2013/2014


TS. o Trung Kin H Bch khoa H Ni

You might also like