Bai 7- Ke Thua Va Da Xa
-
Upload
phuc-phan-tu -
Category
Documents
-
view
218 -
download
0
Transcript of Bai 7- Ke Thua Va Da Xa
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
1/23
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Ngôn ngữ lập trình C và C++Bài 7: Kế thừa và Đa xạ
TS. Đỗ Đăng Khoa
Bộ môn Cơ học Ứng dụngViện Cơ khí
http://chud-dhbkhn.blogspot.com/
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
2/23
Khái niệm về Kế thừa
Kế thừa cho phép định nghĩa một lớp mới từ một lớp khácnhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm củalớp cũ thay vì phải viết mới hoàn toàn
Một lớp được kế thừa từ lớp khác được gọi là lớp dẫn xuất,hoặc lớp con
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuấtMột lớp có thể kế thừa từ một hoặc nhiều lớp cơ sởHàm dựng và hàm hủy không được phép kế thừa cho các lớp
dẫn xuấtCon trỏ của lớp cơ sở có thể chứa được địa chỉ của các đối
tượng của lớp dẫn xuất
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
3/23
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
4/23
Khai báo lớp kế thừa đơn
Cú pháp:class derived-class: access-specifier base-classTrong đó:
derived-class: Tên lớp mớiaccess-specifier : Kiểu kế thừa là public, protected hoặc
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
base-class : Tên lớp đã có.Nếuaccess-specifier không sử dụng, thì mặc định là kếthừa private.
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
5/23
Khai báo lớp kế thừa đơn
Ví dụ: Lớp cơ sở Shape, và lớp dẫn xuất Rectangle.#include using namespace std;
// Base classclass Shape{
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
void setWidth(int w){width = w;
}void setHeight(int h){
height = h;}
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
6/23
Khai báo lớp kế thừa đơn
protected :int width;int height;
};// Derived class
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
public :
int getArea(){return (width * height);
}};
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
7/23
Khai báo lớp kế thừa đơn
int main(void){Rectangle Rect;
Rect.setWidth(5);Rect.setHeight(7);
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
// Print the area of the object.cout
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
8/23
Quyền truy cập
Lớp dẫn xuất có thể truy cập tất cả các thành phần không phảiprivate
Bảng tổng hợp các quyền truy cập
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
9/23
Kiểu kế thừa
Khi dẫn xuất một lớp từ lớp cơ sở, lớp cơ sở có thể được kếthừa theo public, protected và private
Kế thừa public: tất cả thành phần public, protected của lớp cơsở sẽ là thành phần public, protected tương ứng của lớp dẫnxuất. Các thành phần private của lớp cơ sở không truy cập trực
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
,thành phần public và protected của lớp cơ sở.
Kế thừa protected: Các thành phần public, protected của lớpcơ sở sẽ là thành phần protected của lớp dẫn xuất.
Kế thừa private: Các thành phần public, protected của lớp cơsở sẽ là thành phần private của lớp dẫn xuất
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
10/23
Đa kế thừa
Một lớp có thể kế thừa các thành phần từ nhiều lớp cơ sở,được khai báo như sau:class derived-class: access baseA, accessbaseB...access : là public, protected hoặc private.
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
ụ:#include
using namespace std;// Base class Shapeclass Shape{public :
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
11/23
Đa kế thừa
void setWidth( int w){
width = w;}void setHeight( int h)
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
height = h;}
protected :int width;int height;
};
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
12/23
Đa kế thừa
// Base class PaintCostclass PaintCost{
public :int getCost( int area)
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
return area * 70;}
};
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
13/23
Đa kế thừa
// Derived classclass Rectangle: public Shape, public PaintCost{
public :int getArea()
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
return (width * height);
}};
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
14/23
Đa kế thừa
int main( void ){Rectangle Rect; int area;Rect.setWidth(5);Rect.setHeight(7);
area = Rect.getArea();
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
r n e area o e o ec .cout
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
15/23
Đa xạ (polymorphism)
Đa xạ thường xảy ra khi có một hệ thống phân cấp các lớp vàchúng có liên quan bởi việc kế thừa.
Đa xạ có nghĩa là việc gọi tới một hàm thành phần sẽ làm cholàm cho một hàm khác được thực hiện tùy thuộc vào kiểu của đốitượng đó gọi hàm.
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
16/23
Đa xạ (polymorphism)
#include using namespace std;
class Shape {protected :
int width, height;
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
pu c :Shape( int a=0, int b=0){
width = a;height = b;
}
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
17/23
Đa xạ (polymorphism)
int area(){cout
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
18/23
Đa xạ (polymorphism)
class Triangle: public Shape{public :
Triangle( int a=0, int b=0):Shape(a, b) { }int area (){
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
cou r ang e c ass area : en ;return (width * height / 2);
}};
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
19/23
Đa xạ (polymorphism)
// Main function for the programint main( ){
Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
s ore e a ress o ec ang eshape = &rec;// call rectangle area.shape->area();
// store the address of Triangleshape = &tri;// call triangle area.
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
20/23
Đa xạ (polymorphism)
shape->area();return 0;}
Kết quả in ra:Parent class areaParent class area
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
lớp cơ sở. Đây được gọi là liên kết tĩnh – hàm gọi được đã xácđịnh trước khi chương trình thực hiện
Để giải quyết vấn đề, bổ sung thêm từ khóavirtual trướchàm area của lớp Shape:
virtual int area()
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
21/23
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
22/23
Hàm ảo (Virtual Function)
Hàm ảo là hàm trong lớp cơ sở được khai báo sử dụng từ khóavirtual
Việc định nghĩa một hàm ảo trong lớp cơ sở, một hàm tương tựtrong lớp dẫn xuất nhằm nói với trình biên dịch hàm này khôngđược liên kết tĩnh mà là liên kết động.
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
hủy
-
8/19/2019 Bai 7- Ke Thua Va Da Xa
23/23
Hàm thuần ảo
Hàm thuần ảo được khai báo như sau:virtual kiểu tên_hàm() = 0;
Hàm thuần ảo không có thân hàmKhai báo hàm thuần ảo trong lớp cơ sở nhằm yêu cầu các lớp
dẫn xuất từ lớp này bắt buộc phải có phần triển khai riêng hàm
TRƯỜNG ĐẠI HỌCBÁCH KHOA HÀ NỘI
.