Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa

Kế thừa cho phép định nghĩa một lớp mới từ một lớp khác

nhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm của

lớ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

Lớp cho phép việc kế thừa gọi là lớp cơ sở hoặc lớp cha

TRƯỜNG ĐẠI HỌC

BÁCH KHOA HÀ NỘI

Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất

Mộ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ất

Con 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

pdf 23 trang yennguyen 2840
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa

Bài giảng Ngôn ngữ lập trình C và C+ - Bài 7: Kế thừa và Đa xạ - Đỗ Đăng Khoa
5/18/2015
1
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ụng
Viện Cơ khí
5/18/2015
2
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ác
nhằm mở rộng và sử dụng lại các thành phần dữ liệu và hàm của
lớ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
Lớp cho phép việc kế thừa gọi là lớp cơ sở hoặc lớp cha
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất
Mộ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ất
Con 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
5/18/2015
3
Khái niệm về Kế thừa
Lớp kế thừa mặc nhiên có thể sử dụng một phần hoặc toàn bộ 
các thành phần của lớp cơ sở
Tuỳ thuộc vào kiểu kế thừa. Có 3 kiểu kế thừa: public, 
protected và private
Ví dụ về kế thừa:
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
5/18/2015
4
Khai báo lớp kế thừa đơn
Cú pháp:
class derived-class: access-specifier base-class
Trong đó: 
derived-class: Tên lớp mới
access-specifier: Kiểu kế thừa là public, protected hoặc
private
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
 base-class: Tên lớp đã có.
Nếu access-specifier không sử dụng, thì mặc định là kế
thừa private.
5/18/2015
5
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 class
class Shape{
public:
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
void setWidth(int w){
width = w;
}
void setHeight(int h){
height = h;
}
5/18/2015
6
Khai báo lớp kế thừa đơn
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape{
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
public:
int getArea(){ 
return (width * height); 
}
};
5/18/2015
7
Khai báo lớp kế thừa đơn
int main(void){
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << 
endl;
return 0;
}
5/18/2015
8
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ải
private
Bảng tổng hợp các quyền truy cập
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
5/18/2015
9
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ẫn
xuất. Các thành phần private của lớp cơ sở không truy cập trực
tiếp từ lớp dẫn xuất, nhưng có thể truy cập bằng cách gọi các
TRƯỜNG ĐẠI HỌC 
BÁ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ớp
cơ 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
5/18/2015
10
Đ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, access 
baseB...
access: là public, protected hoặc private.
Ví dụ:
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
#include 
using namespace std;
// Base class Shape
class Shape{
public:
5/18/2015
11
Đa kế thừa
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
height = h;
}
protected:
int width;
int height;
};
5/18/2015
12
Đa kế thừa
// Base class PaintCost
class PaintCost
{
public:
int getCost(int area)
{
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
return area * 70;
}
};
5/18/2015
13
Đa kế thừa
// Derived class
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{ 
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
return (width * height); 
}
};
5/18/2015
14
Đa kế thừa
int main(void){
Rectangle Rect; int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// Print the area of the object.
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
cout << "Total area: " << Rect.getArea() << 
endl;
// Print the total cost of painting
cout << "Total paint cost: $" << 
Rect.getCost(area) << endl;
return 0; }
5/18/2015
15
Đ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 cho
làm cho một hàm khác được thực hiện tùy thuộc vào kiểu của đối
tượng đó gọi hàm.
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
5/18/2015
16
Đa xạ (polymorphism)
#include 
using namespace std;
class Shape {
protected:
int width, height;
public:
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
5/18/2015
17
Đa xạ (polymorphism)
int area(){
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
public:
Rectangle( int a=0, int b=0):Shape(a, b) { 
}
int area (){ 
cout << "Rectangle class area :" <<endl;
return (width * height); }};
5/18/2015
18
Đa xạ (polymorphism)
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{ 
cout << "Triangle class area :" <<endl;
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
return (width * height / 2); 
}
};
5/18/2015
19
Đa xạ (polymorphism)
// Main function for the program
int main( ){
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// store the address of Rectangle
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
shape = &rec;
// call rectangle area.
shape->area();
// store the address of Triangle
shape = &tri;
// call triangle area.
5/18/2015
20
Đa xạ (polymorphism)
shape->area();
return 0;}
Kết quả in ra:
Parent class area
Parent class area
Hàm area() được thiết lập một lần bởi trình biên dịch là hàm của
TRƯỜNG ĐẠI HỌC 
BÁ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óa virtual trước
hàm area của lớp Shape:
virtual int area()
5/18/2015
21
Đa xạ (polymorphism)
Kết quả in ra:
Rectangle class area
Triangle class area
Với từ khóa virtual, trình biên dịch tìm kiếm nội dung của con 
trỏ thay vì kiểu của nó. Do đó, từ lúc địa chỉ của các lớp Triangle 
và Rectangle được chứa trong *shape, hàm area tương ứng sẽ
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
được gọi. 
Chúng ta có các lớp với một hàm tên giống nhau, thậm chí cùng
tham số, nhưng được triển khai khác nhau. Đây là cách đa xạ
thường được dùng
5/18/2015
22
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óa
virtual
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.
Hàm ảo không dùng cho hàm dựng nhưng có dùng cho hàm
TRƯỜNG ĐẠI HỌC 
BÁCH KHOA HÀ NỘI
hủy
5/18/2015
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àm
Khai 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ỌC 
BÁCH KHOA HÀ NỘI

File đính kèm:

  • pdfbai_giang_ngon_ngu_lap_trinh_c_va_c_bai_7_ke_thua_va_da_xa_d.pdf