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