Tải bản đầy đủ (.ppt) (51 trang)

Tài liệu lập trình C tiếng Việt lesson 5Inheristance

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (337.14 KB, 51 trang )

Lập trình hướng đối tượng

Bài 5: Thừa kế


Nội dung


Giới thiệu



Thừa kế đơn



Đa hình và hàm ảo



Đa thừa kế

2


Giới thiệu


Cho phép tạo lớp mới dẫn xuất từ lớp đã có

Point



Circle
Point

Base class/supper
class/ parent class

3D-Point

Devived class/
subclass/ child
class

3D-Point
Sphere
3


Khái niệm thừa kế
Polygon
Rectangle

Triangle

class Polygon
{
private:
int width, length;
public:
void set(int w, int l);

}

class Rectangle{
private:
int width, length;
public:
void set(int w, int l);
int area();
}
class Triangle{
private:
int width, length;
public:
void set(int w, int l);
int area();
}
4


Khái niệm thừa kế
Polygon

Rectangle

Triangle

class Rectangle : public Polygon
{
public: int area();
}


class Polygon
{
protected:
int width, length;
public:
void set(int w, int l);
}
class Rectangle{
protected:
int width, length;
public:
void set(int w, int l);
int area();
}
5


Khái niệm thừa kế
Polygon

Rectangle

Triangle

class Triangle : public Polygon
{
public: int area();
}


class Polygon
{
protected:
int width, length;
public:
void set(int w, int l);
}
class Triangle{
protected:
int width, length;
public:
void set(int w, int l);
int area();
}
6


Khái niệm thừa kế
x
y

Point
Circle

3D-Point

x
y
r


x
y
z

class Circle : public Point
{
private:
double r;
}

class Point
{
protected:
int x, y;
public:
void set(int a, int b);
}

class 3D-Point: public Point
{
private:
int z;
}
7


Khái niệm thừa kế


Mở rộng lớp gốc




Cá biệt hóa lớp gốc

Polygon

Rectangle

Point

Circle

Triangle

ComplexNumbe
r
real

RealNumbe
r

3D-Point

real
imag

ImaginaryNumber

imag

8


Tại sao lại thừa kế ?
Thừa kế là cơ chế cho phép

 Xây

dựng các lớp mới từ các lớp đã có

 Xác

định lớp mới là:
 Cá biệt hóa
 Mở rộng
của lớp đã có

9


Xác định sự phân cấp các lớp


Cú pháp:
class DerivedClassName : access-level BaseClassName
ở đây
 access-level xác định dạng thừa kế
 private (mặc định), hoặc
 public




Mọi lớp đều có thể là lớp cơ sở


Lớp dẫn xuất có thể là lớp cơ sở của 1 lớp khác

10


Sự dẫn xuất lớp
Point
3D-Point
Sphere
class 3D-Point : public Point{
private: double z;
……
}

class Point{
protected:
int x, y;
public:
void set(int a, int b);
}
class Sphere : public 3D-Point{
private: double r;
……
}


Point là lớp cơ sở của 3D-Point, trong khi 3D-Point là lớp cơ sở của Sphere
11


Thừa kế là gì?


Về nguyên tắc, mọi thành phần của lớp cơ sở được thừa kế bởi lớp dẫn xuất


có thể với quyền truy cập khác

12


Điều khiển truy cập các thành phần


members goes to

derive from

b a s e c la s s / s u p e r c la s s /
p a r e n t c la s s

d e r iv e d c la s s / s u b c la s s /
c h ild c la s s

Hai mức điều khiển truy cập
trên các thành phần

 Mức

lớp
 Mức thừa kế
class Point{
protected: int x, y;
public: void set(int a, int b);
}
class Circle : public Point{
……
}
13


Quyền truy cập của lớp dẫn xuất
Type of Inheritance
Access Control
for Members

private

protected

public

private

private

private


private

protected

private

protected

protected

public

private

protected

public

14


Thừa kế những thành phần nào?


Về nguyên tắc, mọi thành phần của lớp cơ sở được thừa kế bởi lớp dẫn xuất





Chỉ với quyền truy cập khác

Tuy nhiên, có các ngoại lệ


Thiết lập và hủy bỏ



operator=()



Bạn bè

Do các hàm này là xác định theo lớp

15


Các luật thiết lập của lớp dẫn xuất
Thiết lập và hủy bỏ mặc định được gọi
khi đối tượng mới của lớp dẫn xuất
được tạo hoặc hủy bỏ.
class A {
public:
A()
{cout<< “A:default”<A (int a)
{cout<<“A:parameter”<

}

B test(1);

class B : public A
{
public:
B (int a)
{cout<<“B”<}

output:

A:default
B
16


Các luật thiết lập của lớp dẫn xuất
Có thể xác định thiết lập của lớp cơ sở
khác hơn thiết lập mặc định
DerivedClassCon ( derivedClass args ) : BaseClassCon ( baseClass
args )
{ DerivedClass constructor body }

class A {
public:
A()
{cout<< “A:default”<A (int a)

{cout<<“A:parameter”<}

class C : public A
{
public:
C (int a) : A(a)
{cout<<“C”<}
output:

C test(1);

A:parameter
C
17


Xác định các thành phần riêng
Lớp thừa kế có thể xác định các
thành phần riêng bổ sung vào các
thành phần được thừa kế

Point
x
y
r

x
y


Circle

class Circle : public Point{
private:
double r;
public:
void set_r(double c);
}

class Point{
protected:
int x, y;
public:
void set(int a, int b);
}
protected:
int x, y;
private:
double r;
public:
void set(int a, int b);
void set_r(double c);
18


Thậm chí nhiều hơn …


Lớp dẫn xuất có thể viết chồng các phương thức

được xác định bởi lớp cha. Với việc viết chồng,



Phương thức của lớp con có ký hiệu xác định tới phương
thức của lớp cơ sở.
Lớp con thể hiện phiên bản của nó đối với phương thức của
lớp cơ sở.

class A {
protected:
int x, y;
public:
void print ()
{cout<<“From A”<}

class B : public A
{
public:
void print ()
{cout<<“From B”<}
19


Truy cập phương thức
class Point
{
protected:

int x, y;
public:
void set(int a, int b)
{x=a; y=b;}
void foo ();
void print();
}
Point A;
A.set(30,50); // from base class Point
A.print(); // from base class Point

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); // from class Circle
C.foo (); // from base class Point
C.print(); // from class Circle
20


Đặt chúng cùng nhau




Time



Time là lớp cơ sở
ExtTime là lớp dẫn xuất với
thuộc tính thừa kế public
Lớp dẫn xuất có thể



ExtTime






Thừa kế tất cả các thành phần của
lớp cơ sở, trừ phương thức thiết lập
Truy cập tới tất cả các thành phần
public và protected của lớp cơ sở
Xác định các dữ liệu riêng của mình
Cung cấp phương thức thiết lập riêng
Xác định các hàm thành phần public
Xác định các hàm viết chồng lớp cơ
sở

21



Xác định lớp Time
// SPECIFICATION FILE

( time.h)

class Time
{
public :
void
void
void
Time
Time

Set ( int h, int m, int s ) ;
Increment ( ) ;
Write ( ) const ;
( int initH, int initM, int initS ) ; // constructor
();
// default constructor

protected :
int
int
int

hrs ;
mins ;

secs ;

};

22


Biểu đồ giao diện lớp
Time class
Set
Increment
Write
Time

Protected data:
hrs
mins
secs

Time

23


Lớp dẫn xuất ExtTime
// SPECIFICATION FILE

( exttime.h)

#include “time.h”

enum ZoneType {EST, CST, MST, PST, EDT, CDT, MDT, PDT } ;
class ExtTime : public Time
{

// Time is the base class and use public inheritance

public :
void
void
ExtTime
ExtTime

Set ( int h, int m, int s, ZoneType timeZone ) ;
Write ( ) const; //overridden
(int initH, int initM, int initS, ZoneType initZone ) ;
(); // default constructor

private :
ZoneType zone ;

// added data member

};

24


Biểu đồ giao diện lớp
ExtTime class


Set
Increment
Write

Set
Increment
Write

Protected data:
hrs
mins

ExtTime
ExtTime

Time

secs

Time
Private data:
zone

25


×