Bài giảng Phương pháp lập trình hướng đối tượng - Tuần 07: Hàm dựng, Hàm hủy, Ba vấn đề con trỏ trong kế thừa - Phạm Tú San
Tuần 07:
Hàm dꢀng, Hàm hꢁy,
Ba vꢂn đꢃ con trꢄ trong kꢅ thꢆa
QUAN HỆ GIỮA CÁC ĐỐI TƯỢNG
Liên hꢀ giꢁa các lꢂp đꢃi tưꢄng (chương 6)
Quan hệ bao hàm (HAS-A)
Bao hàm phụ thuộc (composition)
Bao hàm độc lập (aggregation)
Tổng quát hóa (IS-A)
Friend
Quan hệ phụ thuộc
Nꢅi dung
Hàm dựng trong kế thừa.
Hàm hủy trong kế thừa.
Ba vấn đề về con trỏ trong kế thừa.
Bài tập.
4
Hàm dꢆng trong kꢇ thꢈa
Trình tự tạo lập đối tượng kế thừa:
Nhà được xây từ móng đến mái.
Khái niệm được định nghĩa từ thấp đến cao.
Đối tượng được tạo lập từ lõi đến vỏ.
Thành phần kế thừa từ lớp cơ sở được tạo trước.
Đối tượng kế thừa
Đối tượng cơ sở
Thành phần cơ sở
Thành phần mới
Xây móng đến mái
Tạo lập từ lõi đến vỏ
Hàm dꢆng trong kꢇ thꢈa
Khi một đối tượng thuộc lớp con được gọi:
Hàm dựng của lớp cha sẽ tự động được gọi thực
hiện trước
Sau đó, hàm dựng của lớp con sẽ được thực hiện.
Trong hàm dựng của lớp con, chúng ta có thể chỉ
định hàm dựng nào của lớp cha sẽ được gọi thực
hiện. Nếu không, hàm dựng mặc định của lớp cha
sẽ được gọi
GVCN gv();
//Hàm dựng GiaoVien() sẽ được gọi trước
//Sau đó tới hàm GVCN()
6
Ví dꢉ hàm dꢆng trong kꢇ thꢈa
class GiaoVien
{
class GVCN : public GiaoVien
{
private:
string
float
public:
GiaoVien();
GiaoVien(string sHoTen,float
fMucLuong);
};
private:
mHoTen;
mMucLuong;
string
public:
GVCN();
mLopCN;
GVCN(string ten, float luong,
string lopcn);
};
Ví dꢉ hàm dꢆng trong kꢇ thꢈa
GiaoVien::GiaoVien()
//1
GVCN::GVCN() //3
{
{
mHoTen = “”;
mLopCN = “”;
mMucLuong = 0;
}
}
GVCN::GVCN(string ten, float luong,
GiaoVien::GiaoVien(string ten, float
string lopcn): GiaoVien(ten, luong)
luong) //2
//4
{
{
mHoTen = ten;
mMucLuong = luong;
}
mLopCN = lopcn;
}
GVCN gv1;
//Hàm GiaoVien() sẽ được gọi
trước
GVCN gv2(“Nguyen A”, 50, “11A”);
//Hàm dựng GiaoVien(“Nguyen A”, 50,) sẽ được
gọi trước
Hàm dꢆng trong lꢂp dꢊn xuꢋt
Lưu ý:
A
B
C
Hàm dựng của lớp dẫn xuất chỉ
được phép chỉ định hàm dựng
nào của lớp cơ sở trực tiếp của
nó thực hiện chứ không thể can
thiệp đến các lớp cơ sở kế thừa
xa hơn.
X
Nꢅi dung
Hàm dựng trong kế thừa.
Hàm hủy trong kế thừa.
Ba vấn đề về con trỏ trong kế thừa.
Bài tập.
10
Hàm hꢌy trong kꢇ thꢈa
Thứ tự huỷ đối tượng kế thừa
Ngược lại với quá trình tạo
Phần vỏ bên ngoài được huỷ trước
Lớp con sẽ bị huỷ trước lớp cha
Mỗi lớp chỉ có 1 hàm huỷ -> không cần chỉ định
Đối tượng kế thừa
Đối tượng cơ sở
Thành phần cơ sở
Thành phần mới
Hủy từ vỏ đến lõi
11
Hàm hꢌy trong kꢇ thꢈa
Khi một đối tượng thuộc lớp con bị hủy:
Hàm hủy của lớp con được gọi thực hiện trước
Sau đó mới đến hàm hủy của lớp cha.
GiaoVien::~GiaoVien()
{
//huỷ giáo viên
~GiaoVien() được gọi sau
~GVCN() được gọi trước
}
GVCN::~GVCN()
{
//huỷ GVCN
}
void main()
{
GVCN a;
}
1
Nꢅi dung
Hàm dựng trong kế thừa.
Hàm hủy trong kế thừa.
Ba vấn đề về con trỏ trong kế thừa.
Bài tập.
13
Ba vꢋn đꢍ con trꢎ trong kꢇ thꢈa
Lớp có thuộc tính con trỏ?
ꢀ Phải thêm vào lớp “ba ông lớn”:
Hàm hủy.
Hàm dựng sao chép.
Toán tử gán.
Lớp kế thừa có thuộc tính con trỏ?
14
Ba vꢋn đꢍ con trꢎ trong kꢇ thꢈa
class GiaoVien
{
class GVCN : public GiaoVien
{
private:
private:
char
*m_strHoTen;
m_fMucLuong;
m_iSoNgayNghi;
float
int
char
public:
GVCN(char *strHoTen,
float fMucLuong,
*m_strLopCN;
public:
GiaoVien(char *strHoTen,
float fMucLuong,
int iSoNgayNghi,
char *strLopCN);
};
int iSoNgayNghi);
};
15
Ba vꢋn đꢍ con trꢎ trong kꢇ thꢈa
Luật “ba ông lớn” trong kế thừa
Lớp kế thừa có thuộc tính con trỏ, phải kèm theo:
Hàm hủy: thu hồi bộ nhớ phần vỏ.
Hàm dựng sao chép: sao chép bộ nhớ phần vỏ.
Toán tử gán: sao chép bộ nhớ phần vỏ.
Kích hoạt “ba ông lớn” của lớp cơ sở:
Hàm hủy: tự động!!.
Hàm dựng sao chép: chỉ định
hàm dựng sao chép lớp cơ sở.
Toán tử gán: thực hiện toán tử gán
lớp cơ sở trước.
16
Hàm dꢆng sao chép
GVCN::GVCN( const GVCN &g): GiaoVien( g )
{
m_strLopCN = new char[strlen(g.strLopCN) + 1];
strcpy(m_strLopCN, g.strLopCN);
}
Toán tꢏ gán trong kꢇ thꢈa
Toán tử gán cho lớp con
Gọi toán tử gán của lớp cha
Gán các thành phần riêng của lớp con
Toán tꢏ gán trong kꢇ thꢈa – lꢂp chꢐa con trꢎ
B& B::operator=(const B& src)
{
if (this == &src)
return *this;
A
B
A::operator=(src);
delete [] this->ptr;
this->iSize = src.iSize;
ptr = new int [this->iSize];
for (int i=0; i<this->iSize; ++i)
this->ptr[i] = src.ptr[i];
return *this;
}
Tóm tꢑt
Hàm dựng trong kế thừa:
Đối tượng kế thừa được tạo lập từ lõi đến vỏ.
Hàm dựng lớp cơ sở gọi trước, tạo phần lõi.
Hàm dựng lớp kế thừa gọi sau, tạo phần vỏ.
Lớp kế thừa có thể chỉ định hàm dựng cơ sở.
Hàm hủy trong kế thừa:
Đối tượng kế thừa được hủy ngược lại với tạo lập.
Hàm hủy lớp kế thừa gọi trước, hủy phần vỏ.
Hàm hủy lớp cơ sở gọi sau, hủy phần lõi.
20
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình hướng đối tượng - Tuần 07: Hàm dựng, Hàm hủy, Ba vấn đề con trỏ trong kế thừa - Phạm Tú San", để 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:
bai_giang_phuong_phap_lap_trinh_huong_doi_tuong_tuan_07_ham.pdf

