Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 7: Sơ lược về kế thừa
Tác giả:
Môn PPLTHĐT
Nguyễn Minh Huy
Phạm Minh Tuấn
Cập nhật:
Hướng dẫn thực hành tuần 7
Trương Phước Lộc
Trần Duy Quang
Mục đích
Tìm hiểu về kế thừa và các vấn đề liên quan.
Nội dung
-
-
-
-
-
Sơ lược về kế thừa..
Hàm dựng và hàm hủy trong kế thừa.
Định nghĩa lại phương thức.
Quan hệ IS-A và HAS-A.
Bài tập.
Yêu cầu
Nắm vững những nội dung trình bày trong các bài hướng dẫn thực hành từ tuần 1 đến
tuần 6.
Hướng dẫn thực hành tuần 6
Sơ lược về kế thừa
1. Sơ lược về kế thừa.
Khái niệm
Kế thừa (inheritance) là một tính chất quan trọng trong lập trình hướng đối tượng. Đó là
khả năng định nghĩa một lớp đối tượng dựa trên một hoặc nhiều lớp đối tượng khác đã
được định nghĩa trước đó. Lớp đối tượng được dùng để định nghĩa gọi là lớp cơ sở (base
class), lớp đối tượng được định nghĩa dựa trên những lớp đối tượng khác gọi là lớp kế
thừa (derive class).
Lớp kế thừa thừa hưởng đầy đủ những tính chất được định nghĩa trong lớp cơ sở. Việc kế
thừa có thể được thực hiện thành nhiều cấp tạo nên cây kế thừa.
Trong C++, kế thừa được khai báo theo cấu trúc sau:
class <Tên lớp kế thừa> : <Loại kế thừa> <Tên lớp cơ sở>
{
private:
<Khai báo thành phần riêng>
public:
<Khai báo thành phần công cộng>
};
Ví dụ chúng ta xây dựng lớp Car dựa trên lớp Vehicle như sau:
class Vehicle
{
private:
float m_fWeight;
public:
float GetWeight()
{
return this->m_fWeight;
}
void SetWeight(float fWeight)
{
this->m_fWeight = fWeight;
}
};
class Car : public Vehicle
{
private:
int
m_iNumberOfSeats;
Tploc/[email protected]
1
Hướng dẫn thực hành tuần 6
Sơ lược về kế thừa
public:
int GetNumberOfSeats()
{
return this->m_iNumberOfSeats;
}
void SetNumberOfSeats(int iNumberOfSeats)
{
this->m_iNumberOfSeats = iNumberOfSeats;
}
};
Do lớp kế thừa được định nghĩa dựa trên lớp cơ sở, nên lớp Car thừa hưởng thuộc tính
m_fWeight và 2 phương thức GetWeight và SetWeight từ lớp Vehicle. Chúng ta chỉ việc
định nghĩa thêm các thuộc tính và phương thức khác cho lớp Car.
Tầm vực
Tầm vực của các thành phần trong lớp đối tượng được cho bởi bảng sau:
Tầm vực
Public
Protected
Private
Sử dụng
bên trong lớp
Sử dụng
từ lớp kế thừa
Sử dụng
bên ngoài lớp
X
X
X
X
X
X
Lớp kế thừa không thể truy xuất được các thành phần có tầm vực là private trong lớp cơ
sở. Trong ví dụ trên, do thuộc tính m_fWeight của lớp Vehicle có tầm vực là private nên
trong lớp Car, chúng ta không thể truy xuất được thuộc tính này.
Trong lớp kế thừa, để truy xuất đến thành phần của lớp cơ sở, ta dùng toán tử “::”, ví dụ:
class A
{
public:
void funcA()
{
cout << "funcA of class A.";
}
};
class B : public A
{
public:
void funcA()
{
Tploc/[email protected]
2
Hướng dẫn thực hành tuần 6
cout << "funcA of class B.";
Sơ lược về kế thừa
}
void funcB()
{
funcA();
// Goi phuong thuc funcA cua lop B.
A::funcA(); // Goi phuong thuc funcA cua lop A.
}
};
Phân loại kế thừa
Có 3 hình thức kế thừa trong C++: public, protected và private.
Tầm vực của các thành phần trong lớp đối tượng qua các hình thức kế thừa được cho bởi
bảng sau:
Tầm vực
public
protected
private
Kế thừa public
public
protected
Kế thừa protected
protected
protected
Kế thừa private
private
private
Không thể truy xuất Không thể truy xuất Không thể truy xuất
Ví dụ:
class A
{
private:
int
m_iPrivate;
protected:
int
m_iProtected;
m_iPublic;
public:
int
};
// Ke thua public
// - m_iPrivate khong the truy xuat.
// - m_iProtected giu nguyen tam vuc protected.
// - m_iPublic giu nguyen tam vuc public.
class B : public A {};
// Ke thua protected
// - m_iPrivate khong the truy xuat.
// - m_iProtected giu nguyen tam vuc protected.
// - m_iPublic chuyen thanh tam vuc protected.
class C : protected A {};
Tploc/[email protected]
3
Hướng dẫn thực hành tuần 6
Sơ lược về kế thừa
// Ke thua private
// - m_iPrivate khong the truy xuat.
// - m_iProtected chuyen thanh tam vuc private.
// - m_iPublic chuyen thanh tam vuc private.
class D : private A{};
Tploc/[email protected]
4
Hướng dẫn thực hành tuần 6
Hàm dựng và hàm hủy trong kế thừa
2. Hàm dựng và hàm hủy trong kế thừa.
Hàm dựng trong kế thừa
Khi một đối tượng thuộc lớp kế thừa được tạo lập, hàm dựng của lớp cơ sở được gọi thực
hiện trước, sau đó mới đến hàm dựng của lớp kế thừa. Trong hàm dựng của lớp kế thừa,
chúng ta có thể chỉ ra sẽ gọi hàm dựng nào của lớp cơ sở. Trường hợp không chỉ ra, hàm
dựng mặc định của lớp cơ sở sẽ được gọi.
Xét ví dụ sau:
class A
{
public:
A()
{
cout << "Default constructor of class A." << endl;
}
};
class B : public A
{
public:
B(int iVar)
{
cout << "Constructor(int) of class B." << endl;
}
};
class C: public B
{
public:
C(int iVar) : B(iVar)
{
cout << "Constructor(int) of class C." << endl;
}
};
void main()
{
C
obj(5);
}
Ví dụ trên cho thấy thứ tự gọi thực hiện của các hàm dựng trong cây kế thừa. Ban đầu
hàm dựng mặc định của lớp A được gọi trước, kế đến là hàm dựng 1 tham số của lớp B,
sau cùng là hàm dựng 1 tham số của lớp C.
Tploc/[email protected]
5
Hướng dẫn thực hành tuần 6
Hàm dựng và hàm hủy trong kế thừa
Hàm hủy trong kế thừa
Khi một đối tượng thuộc lớp kế thừa bị hủy, hàm hủy của lớp kế thừa được gọi thực hiện
trước, sau đó mới đến hàm hủy của lớp cơ sở.
Xét ví dụ sau:
class A
{
public:
virtual ~A()
{
cout << "Destructor of class A." << endl;
}
};
class B : public A
{
public:
virtual ~B()
{
cout << "Destructor of class B." << endl;
}
};
class C : public B
{
public:
virtual ~C()
{
cout << "Destructor of class C." << endl;
}
}
void main()
{
C
obj;
}
Ví dụ trên cho ta thấy thứ tự gọi thực hiện của các hàm hủy trong cây kế thừa. Ban đầu
hàm hủy của lớp C được gọi trước, kế đến là hàm hủy của lớp B, sau cùng là hàm hủy
của lớp A.
Tploc/[email protected]
6
Hướng dẫn thực hành tuần 6
Định nghĩa lại phương thức
3. Định nghĩa lại phương thức
Trong một số trường hợp, chúng ta cần định nghĩa lại các phương thức của lớp cơ sở
trong lớp kế thừa (chỉ những phương thức có tầm vực là public và protected). Việc này
được thực hiện bằng cách khai báo và cài đặt lại các phương thức này trong lớp kế thừa.
Phương thức được định nghĩa lại còn được gọi là hàm nạp chồng (overriden function).
Ví dụ:
#include "iostream.h"
#include "vector"
using namespace std;
class Animal
{
public:
vector<Animal *> GiveBirth() { // Codes for GiveBirth... }
float GiveMilk() { // Codes for GiveMilk... }
void Talk()
{
cout << "Don't know how to talk!";
}
};
class Cat : Animal
{
public:
void Talk()
{
cout << "meo meo!";
}
};
class Dog : Animal
{
public:
void Talk()
{
cout << "gau gau!";
}
};
Trong ví dụ trên, lớp Cat và Dog kế thừa từ lớp Animal để tái sử dụng lại các phương
thức GiveBirth() và GiveMilk(). Nhưng bên cạnh đó, chúng đã định nghĩa lại phương
thức Talk() của lớp Animal cho phù hợp.
Tploc/[email protected]
7
Hướng dẫn thực hành tuần 6
Quan hệ IS-A và HAS-A
4. Quan hệ “IS-A” và “HAS-A”
Quan hệ IS-A
Do lớp kế thừa được định nghĩa dựa trên lớp cơ sở, các đối tượng của lớp kế thừa được
xem như cùng loại với các đối tượng của lớp cơ sở. Vì vậy, chúng ta không thể tự tiện
thực hiện việc kế thừa trong mọi trường hợp muốn tái sử dụng thuộc tính và phương
thức của một lớp.
Việc kế thừa giữa 2 lớp chỉ nên được thực hiện khi và chỉ khi giữa chúng có quan hệ
“IS-A”, có nghĩa là lớp này là một trường hợp đặc biệt của lớp kia.
Ví dụ:
Car là một trường hợp đặc biệt của Vehicle, do đó Car có thể kế thừa từ Vehicle.
Cat và Dog là những trường hợp đặc biệt của Animal, do đó Cat và Dog có thể kế thừa từ
Animal.
Quan hệ HAS-A
Hai lớp được gọi là có quan hệ “HAS-A” khi thành phần thuộc tính của lớp này có chứa
đối tượng của lớp kia. Quan hệ “HAS-A” còn được gọi là quan hệ “bao hàm” hoặc quan
hệ “bộ phận – toàn thể”.
Ví dụ:
Wheel chứa trong Car, do đó Car và Wheel có quan hệ “HAS-A”.
Page chứa trong Book, do đó Book và Page có quan hệ “HAS-A”.
Chú ý:
-
Trong những trường hợp ngữ nghĩa không đóng vai trò quan trọng, quan hệ
“HAS-A” có thể được sử dụng để thay thế cho quan hệ “IS-A”.
-
Quan hệ “IS-A” không thể được sử dụng để thay thế cho quan hệ “HAS-A”.
Tploc/[email protected]
8
Hướng dẫn thực hành tuần 6
Bài tập
5. Bài tập
Bài tập 1:
Cho các cặp lớp đối tượng sau:
-
-
-
-
-
-
-
-
-
-
Hình vuông và hình chữ nhật.
Đa giác và điểm.
Giám đốc và nhân viên.
Hình ellipse và hình tròn.
Máy bay và động cơ máy.
Câu và từ.
Hàng hóa và mỹ phẩm.
Cây trồng và cây lúa.
Thư viện và sách.
Phim ảnh và phim hoạt hình.
Cho biết mối quan hệ giữa các cặp lớp đối tượng trên là “IS-A” hay “HAS-A”. Viết khai
báo lớp cho từng cặp để chỉ ra điều đó.
Ví dụ:
Xe hơi và xe cộ có quan hệ “IS-A”.
Khai báo lớp:
class Vehicle {};
class Car : public Vehicle {};
Sách và trang sách có quan hệ “HAS-A”.
Khai báo lớp:
class Page {};
class Book
{
private:
Page *m_pPages;
};
Bài tập 2:
Công ty ABC cần xây dựng một ứng dụng quản lý nhân sự và tính lương cho nhân viên
trong công ty như sau:
1. Quản lý thông tin về nhân viên: (Họ tên, ngày sinh, địa chỉ)
a. Hiển thị danh sách nhân viên
b. Thêm nhân viên
c. Xóa nhân viên
2. Tính lương cho nhân viên: hiển thị bảng lương theo tháng/năm
Hiện công ty có 3 loại nhân viên và cách tính lương tương ứng cho từng loại nhân viên
như sau:
a. Nhân viên sản xuất: số sản phẩm x 20000 đ
b. Nhân viên công nhật: số ngày công x 50.000 đ
c. Nhân viên quản lý: lương cơ bản x hệ số lương
Tploc/[email protected]
9
Hướng dẫn thực hành tuần 6
Bài tập
Bài tập 3:
Một trung tâm tin học cần quản lý giảng viên cơ hữu và giảng viên
thỉnh giảng
-
-
Giảng viên cơ hữu ký hợp đồng lao động lớn hơn 1 năm được hưởng thu nhập hàng
tháng bao gồm lương thỏa thuận cố định và lương cộng thêm trong trường hợp vượt
giờ quy định trong tháng (số giờ quy định là 40 giờ). Thông tin giảng viên cơ hữu:
tên giảng viên, email, địa chỉ, điện thoại, số giờ giảng dạy trong tháng, lương thỏa
thuận và số giờ quy định chung trong tháng.
Giảng viên tham gia giảng dạy thỉnh giảng ký hợp đồng lao động theo từng lớp học
được hưởng thu nhập hàng tháng theo số giờ lên lớp. Biết rằng mỗi giờ dạy có giá
200.000 VNĐ. Thông tin giảng viên thỉnh giảng: tên giảng viên, email, địa chỉ, điện
thoại, cơ quan làm việc, số giờ giảng dạy trong tháng
Hãy xây dựng chương trình cho phép nhân viên trong trung tâm thực hiện các chức năng
sau:
(1) Nhập vào thông tin của các giảng viên
(2) Xuất danh sách toàn bộ giảng viên
(3) Xuất danh sách giảng viên cơ hữu
(4) Xuất danh sách giảng viên thỉnh giảng
(5) Tính tổng số tiền lương của toàn bộ giảng viên
(6) Tìm loại giảng viên có tổng lương cao nhất.
Bài tập 4:
Một nông trại chăn nuôi có 3 loại gia súc: bò, cừu, và dê. Mỗi loại gia súc đều có thể sinh
con, cho sữa và phát ra tiếng kêu riêng của chúng. Khi đói, các gia súc sẽ phát ra tiếng
kêu để đòi ăn. Sau một thời gian chăn nuôi, người chủ nông trại muốn thống kê xem
trong nông trại có bao nhiêu gia súc ở mỗi loại, tổng số lit sữa mà tất cả các gia súc của
ông đã cho.
Áp dụng kế thừa, xây dựng chương trình cho phép người chủ nông trại nhập vào số lượng
gia súc ban đầu ở mỗi loại.
a. Một hôm người chủ nông trại đi vắng, tất cả gia súc trong nông trại đều đói. Hãy cho
biết những tiếng kêu nghe được trong nông trại.
b. Chương trình sẽ đưa ra thống kê các thông tin người chủ mong muốn (nêu trên) sau
một lứa sinh và một lược cho sữa của tất cả gia súc. Biết rằng:
-
-
-
-
Tất cả gia súc ở mỗi loại đều sinh con.
Số lượng sinh của mỗi gia súc là ngẫu nhiên.
Tất cả gia súc ở mỗi loại đều cho sữa.
Số lit sữa mỗi gia súc cho là ngẫu nhiên nhưng trong giới hạn sau:
• Bò: 0 – 20 lit.
• Cừu: 0 – 5 lit.
• Dê: 0 – 10 lit.
Tploc/[email protected]
10
Bạn đang xem tài liệu "Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 7: Sơ lược về kế thừa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
tai_lieu_huong_dan_thuc_hanh_mon_phuong_phap_lap_trinh_huong.pdf

