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

Bài giảng lập trình hướng đối tượng dùng c + +chương 5 tính kế thừa

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 (6.57 MB, 51 trang )

Chương 5. Tính kế thừa
(Inheritance)
TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 10 tháng 04 năm 2015
#2
Nội dung
1. Giới thiệu
2. Khái niệm kế thừa
3. Đơn kế thừa
4. Đa kế thừa
5. Lớp cơ sở ảo
#3
Giới thiệu [1/10]
Ngoài việc nhóm các đối tượng có cùng tập thuộc
tính/hành vi lại với nhau, con người thường nhóm
các đối tượng có cùng một số thuộc tính/ hành vi

Ví dụ: nhóm tất cả xe chạy bằng động cơ thành
một nhóm, rồi phân thành các nhóm nhỏ hơn tuỳ
theo loại xe (xe ô tô, xe tải, )
#4
Giới thiệu [2/10]
Mỗi nhóm con là một lớp các đối tượng tương tự,
nhưng giữa các nhóm con có chung một số đặc
điểm
Quan hệ giữa các nhóm con với nhóm lớn được gọi
là quan hệ “là một” (is-a)
#5
Giới thiệu [3/10]


Ví dụ:
o
Một cái xe ô tô “là một” xe động cơ
o
Một cái xe tải “là một” xe động cơ
o
Một cái xe máy “là một” xe động cơ
→ Dùng cấu trúc hướng đối tượng để định nghĩa
quan hệ “là một”
#6
Giới thiệu [4/10]
Các đối tượng được nhóm lại thành một lớp thì có
cùng tập thuộc tính và hành vi

Mọi đối tượng xe động cơ có cùng tập thuộc tính
và hành vi
→ Mọi đối tượng xe tải có cùng tập thuộc tính và
hành vi
#7
Giới thiệu [5/10]
Mối liên kết giữa các lớp trong quan hệ “là một” xuất
phát từ thực tế rằng các lớp con cũng có mọi thuộc
tính/ hành vi của lớp cha, và cộng thêm các thuộc
tính/ hành vi khác
#8
Giới thiệu [6/10]
Lớp cha – superclass (hoặc lớp cơ sở - base class)

Lớp tổng quát hơn trong mối quan hệ “là một”


Các đối tượng thuộc lớp cha có cùng tập thuộc tính
và hành vi
#9
Giới thiệu [7/10]
Lớp con – subclass (hoặc lớp dẫn xuất – derived
class)

Lớp cụ thể hơn trong một quan hệ “là một”

Các đối tượng thuộc lớp con có cùng tập thuộc
tính và hành vi (do kế thừa từ lớp cha), kèm thêm
tập thuộc tính và hành vi của riêng lớp con
#10
Giới thiệu [8/10]
Quan hệ “là một” còn gọi là sự kế thừa
(inheritance)
Ta nói rằng lớp con “kế thừa từ” lớp cha, hoặc lớp
con “được dẫn xuất từ” lớp cha
→ Kế thừa là quá trình tạo nên lớp mới bằng cách
dẫn xuất từ lớp cũ
#11
Giới thiệu [9/10]
Ưu điểm của việc kế thừa

Tiết kiệm thời gian và công sức

Tái sử dụng lại những lớp có sẵn

Giảm lượng code phải thiết kế, viết, kiểm tra


Tránh trùng lắp code

Rút ngắn thời gian giúp LTV tập trung vào mục tiêu

Giúp phân loại và thiết kế lớp dễ dàng, dễ quản lý
#12
Giới thiệu [10/10]
Phân loại

Đơn kế thừa (single inheritance): chỉ có một lớp
cha

Đa kế thừa (multiple inheritance): có nhiều lớp cha
#13
Sơ đồ quan hệ đối tượng [1/3]
(Object Relationship Diagram – ORD)
Thể hiện

Sự khác nhau giữa
lớp cơ sở và lớp
dẫn xuất

Sự khác nhau giữa
các lớp dẫn xuất
#14
Sơ đồ quan hệ đối tượng [2/3]
Biểu diễn các thành phần:

private: thêm dấu trừ phía trước tên


public: thêm dấu cộng phía trước tên
#15
Sơ đồ quan hệ đối tượng [3/3]
Đối với những lớp dẫn xuất, chỉ cần liệt kê các
thuộc tính/ hành vi mà lớp cơ sở không có

Đơn giản hoá sơ đồ

Nhấn mạnh các điểm
khác biệt
#16
Cây kế thừa [1/2]
Các quan hệ kế thừa luôn được biểu diễn với các
lớp dẫn xuất đặt dưới lớp cơ sở để nhấn mạnh bản
chất phả hệ của quan hệ
#17
Cây kế thừa [2/2]
Kế thừa phần lớn các thành viên dữ liệu và phương thức
của lớp cơ sở
Lớp dẫn
xuất
Có thể bổ sung thêm các thành viên dữ liệu mới và các
phương thức mới
(ngoại trừ constructor,
destructor)
Lớp cơ sở trực tiếp
Lớp cơ sở
Lớp cơ sở gián tiếp
Class A
Class B

Class C
#18
Kế thừa vs Quan hệ khác

Đây là quan hệ không dựa trên kế
thừa

Mối quan hệ này gọi là quan hệ
“có một” (has-a) cũng được gọi là
quan hệ bao gộp (aggregation)
#19
Đơn kế thừa [1/2]
Cú pháp
class derived_class_name : type_of_inheritance base_class_name
{
member_list
};

type_of_inheritance là public, protected hoặc private. Mặc định là
private.

Từ khoá truy xuất của thuộc tính: public, private, protected.
#20
Đơn kế thừa [2/2]
Thuộc tính truy xuất
thành viên của lớp
cơ sở
Kiểu kế thừa
public protected private
public

public trong lớp
dẫn xuất
protected trong
lớp dẫn xuất
private trong
lớp dẫn xuất
protected
protected trong
lớp dẫn xuất
protected trong
lớp dẫn xuất
private trong
lớp dẫn xuất
private
Dấu trong lớp
dẫn xuất
Dấu trong lớp dẫn
xuất
Dấu trong lớp
dẫn xuất
public protected
private
#21
VD - đơn kế thừa [1/4]
class CMyPoint
{
protected:
float x,y;
public:
CMyPoint(float a= 0, float b= 0);

void SetPoint(float a, float b);
float GetX() const
{
return x;
}
float GetY() const
{
return y;
}
void Print() const;
};
#22
VD - đơn kế thừa [2/4]
CMyPoint::CMyPoint(float a, float b)
{
SetPoint(a, b);
}
void CMyPoint::SetPoint(float a, float b)
{
x = a;
y = b;
}
void CMyPoint::Print() const
{
cout << "(" << x << ", " << y << ")" << endl;
}
#23
VD - đơn kế thừa [3/4]
class CCircle : public CMyPoint
{

protected:
float radius;
public:
CCircle(float r = 0.0, float a = 0, float b = 0);
void SetRadius(float r);
void SetCircle(float r, float a, float b);
float GetRadius() const;
float Area() const;
void Print() const;
};
CCircle::CCircle(float r, float a, float b) : CMyPoint(a, b)
{
SetRadius(r);
}
void CCircle::SetRadius(float r)
{
radius = r;
}
#24
VD - đơn kế thừa [4/4]
void CCircle::SetCircle(float r, float a, float b)
{
SetPoint(a,b); //Gọi phương thức của lớp cơ sở
SetRadius(r);
}
float CCircle::GetRadius() const
{
return radius;
}
float CCircle::Area() const

{
return 3.14159f * radius * radius;
}
void CCircle::Print() const
{
cout<<"[ ";
CMyPoint::Print();
cout<<", " << radius <<"]"<<endl;
}
#25
Constructor & destructor trong kế thừa [1/5]
Muốn chỉ định constructor cụ thể của lớp cơ sở

Constructor của lớp dẫn xuất phải chứa các thông
tin làm tham số cho constructor của lớp cơ sở

Gọi constructor của lớp cở sở bằng cách sử dụng
bộ khởi tạo trong constructor của lớp dẫn xuất (cú
pháp giống bộ khởi tạo thành viên)

×