Trong một lớp có thể có nhiều phương
thức thiết lập.
Có thể chỉ định phương thức thiết lập của
lớp cơ sở bằng cách dùng phép toán :
ngay sau phương thức thiết lập của lớp
dẫn xuất.
Hoặc muốn chỉ định một tham số thực
cho phương thức thiết lập của lớp cơ sở
7 trang |
Chia sẻ: thienmai908 | Lượt xem: 1028 | Lượt tải: 0
Nội dung tài liệu Lập trình hướng đối tượng Phần 8, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
11
Object – Oriented Programming
PGS. TS. Trần Văn Lăng
KHOA CÔNG NGHỆ THÔNG TIN
TRƯỜNG ĐẠI HỌC LẠC HỒNG
lang@lhu.edu.vn
2
Chương 8
Tính thừa kế
3
Khái niệm về sự thừa kế
Tạo ra lớp mới từ lớp đã có
Sử dụng lại những kết quả đã có
Tạo ra lớp thừa kế còn được gọi:
Mở rộng (extend) lớp đã có,
Hoặc đặc tả lại (specification)
4
Lớp mới được tạo ra từ lớp đã có gọi là
lớp thừa kế (inheritance class) hay lớp
dẫn xuất (derived class)
Lớp để tạo ra lớp mới gọi là lớp cơ sở
(based class) hay lớp cha (super class)
25
Loại lớp thừa kế
Thừa kế đơn (single inheritance)
Tạo ra lớp dẫn xuất chỉ từ một lớp cơ sở
Thừa kế bội (multiple inheritance)
Lớp dẫn xuất được tạo ra từ hơn 1 lớp cơ sở
6
Cách xây dựng lớp thừa kế dùng C++
class BasedClass{
//...
};
class DerivedClass:BasedClass{
//...
}
7
Ví dụ
class Stack{
int top;
char *data;
int empty();
int full();
public:
Stack();
~Stack();
int push( char );
int pop( char& )
};
8
class Hexa:Stack{
public:
void tohexa( int );
};
void Hexa::tohexa( int N ){
//...
} Hoặc có thể tạo ra phương thức
thiết lập Hexa() thay cho tohexa()
39
class Hexa:Stack{
public:
Hexa( int );
};
Hexa::Hexa( int N ){
//...
}
10
Lưu ý
Lớp dẫn xuất không thể truy cập đến
phương thức thiết lập và phương thức
hủy bỏ của lớp cơ sở
Hàm friend (hay lớp friend) của lớp
cơ sở không thể là hàm friend (hay lớp
friend) của lớp dẫn xuất
11
Các phép toán mới được cài đặt (như là
sự định nghĩa chồng phép toán) có thể
được truy cập bình thường trong lớp dẫn
xuất.
Với những phép toán trả về kiểu của lớp
cơ sở, không sử dụng được trong lớp dẫn
xuất. Điều này vẫn đúng cho cả những
phương thức trả về dữ liệu thuộc lớp cơ
sở.
12
Ví dụ
class Double{
double data;
public:
Double( double = 0.0 );
Double operator+( Double );
};
413
class Sothuc:Double{
public:
//
};
main(){
Sothuc a, b(10), c;
c = a + b; //bị lỗi
}
14
Thừa kế bội
class Derived:Based1, Based2{
//...
};
Cần lưu ý về sự giống nhau của các thành
phần trong 2 lớp cơ sở để tránh sự mơ hồ
khi sử dụng.
Trường hợp này phải thêm tên
lớp phía trước tên thành phần
15
Thừa kế ảo ()
class A
class B class C
class D
16
class A{
//...
};
class B: A{};
class C: A{};
class D: B, C{
//...
};
517
Để tránh tình trạng một thành phần trong
lớp A xuất hiện 2 lần trong lớp D, sử dụng
thừa kế ảo
class B: virtual A{};
class C: virtual A{};
class D: B, C{
//...
};
18
Hình thức thừa kế
Có hai hình thức
private (hình thức chuẩn)
public: nhằm bảo toàn lại thuộc tính của
thành phần
19
Bảng tác động bởi hình thức thừa kế
Không thể truy cập
public
protected
private
public
protected
public
Không thể truy cập
private
private
private
public
protected
private
Derived classBased class
20
Thứ tự thực hiện trong hệ thống
Phương thức thiết lập
Của lớp cơ sở thực hiện trước phương thức
thiết lập của lớp dẫn xuất.
Đối với sự thừa kế bội, phương thức thiết lập
của lớp cơ sở xuất hiện trước được thực hiện
trước.
621
Phương thức huỷ bỏ
Của lớp cơ sở thực hiện sau phương thức huỷ
bỏ của lớp dẫn xuất.
Đối với thừa kế bội, phương thức huỷ bỏ của
lớp xuất hiện trước được thực hiện sau.
22
Ví dụ
class ONE{
public:
ONE(){cout << “First class\n”;}
~ONE(){cout << “Destructor of first class\n”;}
};
class TWO_A:ONE{
public:
TWO_A(){cout << “Second class A\n”;}
~TWO_A(){cout << “Destructor of second A\n”;}
};
class TWO_B:ONE{
public:
TWO_B(){cout << “Second class B\n”;}
~TWO_B(){cout << “Destructor of second B\n”;}
};
23
class THREE:TWO_A,TWO_B{
THREE(){cout << “Third class\n”;}
~THREE(){cout << “Destructor of third class\n”;}
};
main(){
THREE obj;
}
First class
Second class A
Second class B
Third class
Destructor of third class
Destructor of second B class
Destructor of second A class
Destructor of first class
24
Trường hợp chỉ định constructor
Trong một lớp có thể có nhiều phương
thức thiết lập.
Có thể chỉ định phương thức thiết lập của
lớp cơ sở bằng cách dùng phép toán :
ngay sau phương thức thiết lập của lớp
dẫn xuất.
Hoặc muốn chỉ định một tham số thực
cho phương thức thiết lập của lớp cơ sở
725
Ví dụ, có lớp
class Date {
int d, m, y;
public:
Date(int=1,int=1,int=2008);
Date(const string);
};
Date newYear(7,2,2008);
Date christmas(“25 December“);
26
Xây dựng lớp dẫn xuất
class Person:Date{
char* name;
int bd,bm,by;
public:
Person(char*,int,int,int);
//...
};
27
Phương thức thiết lập
Person(char *n,int bd,int bm,
int by):Date( bd,bm,by ){
strcpy(name,n);
d = bd;
m = bm;
y = by;
}
Chỉ sử dụng
phương thức này
28
Yêu cầu
Sử dụng phương thực tự thực hiện trong
các lớp dẫn xuất.
Xây dựng các lớp mới thừa kế từ lớp đã
có
Lớp có các thành viên là lớp khác
Các file đính kèm theo tài liệu này:
- jyksagupierh'iufgoasidu[ps (8).pdf