Tải bản đầy đủ (.pdf) (22 trang)

Bài giảng Kỹ thuật lập trình hệ cơ điện tử: Chương 11 - TS. Đặng Thái Việt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (564.43 KB, 22 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN 
TỬ
Programming Engineering in Mechatronics
Giảng viên: TS. Đặng Thái Việt
Đơn vị: Bộ mơn Cơ điện tử, Viện Cơ khí

Hà Nội, 09/2017

1


KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN TỬ

1.

Tổng quan về ngơn ngữ lập trình

7.

Cấu trúc

2.

Giới thiệu sơ bộ ngơn ngữ C

8.

Vào/ra trong C


3.

Kiểu, tốn tử và biểu thức 

9.

Cơ sở của C++

4.

Dịng điều khiển

10.

Lớp

5.

Hàm và cấu trúc chương trình

11.

Kế thừa và đa hình

6.

Con trỏ và mảng

12.


Luồng vào/ra trong C++
2


CHƯƠNG 11. Kế thừa và Đa hình
11.1  Kế thừa
     ­ Lớp cơ sở và Lớp thừa kế 
     ­ Điều khiển truy cập và Tính kế thừa 
     ­ Kiểu kế thừa
     ­ Đa kế thừa
11.2 Đa hình
     ­ Đa hình trong C++
     ­ Hàm virtual
     ­ Hàm pure virtual

3


Kế thừa
1. Kế thừa
Tính kế thừa (Inheritance). Tính kế thừa cho phép
chúng ta định nghĩa một lớp trong điều kiện một lớp khác,
mà làm cho nó dễ dàng hơn để tạo và duy trì một ứng
dụng.





Lớp đang tồn tại này được gọi là Base Class - lớp cơ

sở, và lớp mới được xem như là Derived Class – lớp
thừa kế.

4


Kế thừa
Lớp cơ sở (Base Class) và Lớp thừa kế (Derived Class) 
trong C++
Một lớp có thể được kế thừa từ hơn một lớp khác, nghĩa
là, nó có thể kế thừa dữ liệu và hàm từ nhiều lớp cơ sở.





Để định nghĩa một lớp kế thừa (Derived Class), chúng ta
sử dụng một danh sách để xác định các lớp cơ sở. Danh
sách này liệt kê một hoặc nhiều lớp cơ sở và có form
sau:

5


Kế thừa
Ví dụ

6



Kế thừa
Ví dụ

7


Kế thừa
Điều khiển truy cập và Tính kế thừa trong C++
Ø

Ø

Một lớp kế thừa có thể truy cập tất cả thành viên không phải là private
của lớp cơ sở của nó. Vì thế, các thành viên lớp cơ sở, mà là hạn chế
truy cập tới các hàm thành viên của lớp kế thừa, nên được khai báo là
private trong lớp cơ sở.
Chúng ta tổng kết các kiểu truy cập khác nhau, tương ứng với ai đó có
thể truy cập chúng như sau:

8


Kế thừa
Ø

Một lớp kế thừa (Derived Class) sẽ kế thừa tất cả các
phương thức của lớp cơ sở, ngoại trừ:

§


Constructor, destructor và copy constructor của lớp cơ sở.

§

Overloaded operator (tốn tử nạp chồng) của lớp cơ sở.

§

Hàm friend của lớp cơ sở.

9


Kế thừa
Kiểu kế thừa trong C++
Ø

§

Khi kế thừa từ một lớp cơ sở, lớp cơ sở đó có thể được kế
thừa thơng qua kiểu kế thừa là public, protected hoặc
private. Kiểu kế thừa trong C++ được xác định bởi Accessspecifier đã được giải thíc ở trên.
Kiểu kế thừa Public: Khi kế thừa từ một lớp cơ sở là public,
thì các thành viên public của lớp cơ sở trở thành các thành
viên public của lớp kế thừa; và các thành viên protected
của lớp có sở trở thành các thành viên protected của lớp
kế thừa. Một thành viên là private của lớp cơ sở là không
bao giờ có thể được truy cập trực tiếp từ một lớp kế thừa,
nhưng có thể truy cập thơng qua các lời gọi tới các thành
viên public và protected của lớp cơ sở đó.

10


Kế thừa
Kiểu kế thừa trong C++
§

§

Kiểu kế thừa protected: Khi kế thừa từ một lớp cơ sở là
protected, thì các thành viên public và protected của lớp cơ
sở trở thành các thành viên protected của lớp kế thừa
Kiểu kế thừa private: Khi kế thừa từ một lớp cơ sở là
private, thì các thành viên public và protected của lớp cơ
sở trở thành các thành viên private của lớp kế thừa

11


Kế thừa
Đa kế thừa trong C++
Ø

Một lớp trong C++ có thể kế thừa các thành viên từ nhiều
lớp, và đây là cú pháp:

Tại đây, access_modifier là public, protected hoặc private
và sẽ được cung cấp cho mỗi lớp cơ sở, và chúng sẽ được
phân biệt với nhau bởi dấu phảy như trên.


12


Kế thừa
Ví dụ

13


Kế thừa
Ví dụ

14


Kế thừa
Ví dụ

15


Đa hình
Đa hình trong C++
Ø

Ø

Đa hình (polymorphism) nghĩa là có nhiều hình thái khác
nhau. Tiêu biểu là, đa hình xuất hiện khi có một cấu trúc
cấp bậc của các lớp và chúng là liên quan với nhau bởi tính

kế thừa.
Đa hình trong C++ nghĩa là một lời gọi tới một hàm thành
viên sẽ làm cho một hàm khác để được thực thi phụ thuộc
vào kiểu của đối tượng mà triệu hồi hàm đó.

16


Đa hình
Ví dụ

17


Đa hình
Ví dụ

18


Đa hình
Ví dụ

Lý do cho output khơng chính xác đó là vì: lời gọi của hàm
dientich() đang được thiết lập một lần bởi compiler như phiên
bản được định nghĩa trong lớp cơ sở đó. Điều này gọi là static
resolution (sự phân giải tĩnh) của lời gọi hàm, hoặc static
linkage (sự liên hợp tĩnh) – lời gọi hàm được sửa trước khi
chương trình được thực thi. Đơi khi nó cũng được gọi là early
binding (hoặc static binding) bởi vì hàm dientich() được thiết

lập trong khi biên dịch chương trình.
19


Đa hình
Ví dụ
Bây giờ, chúng ta sửa chương trình trên một chút và đặt trước dòng int
dientich() trong lớp Hinh với từ khóa virtual, khi đó nó trơng như sau:

20


Đa hình
Hàm virtual trong C++
Ø

Ø

Một hàm virtual là một hàm trong một lớp cơ sở mà được
khai báo bởi sử dụng từ khóa virtual trong C++. Việc định
nghĩa trong một lớp cơ sở một hàm virtual, với phiên bản
khác trong một lớp kế thừa, báo cho compiler rằng: chúng
ta không muốn Static Linkage cho hàm này.
Những gì chúng ta làm là muốn việc lựa chon hàm để được
gọi tại bất kỳ điểm nào đã cung cấp trong chương trình là
dựa trên kiểu đối tượng, mà với đó nó được gọi. Hoạt động
này có thể gọi tắt là dynamic linkage, hoặc late binding
trong C++.
21



Đa hình
Hàm pure virtual trong C++
Ø

Nó là có thể nếu bạn muốn bao một hàm virtual trong một lớp cơ sở,
để mà nó có thể được tái định nghĩa trong một lớp kế thừa để phù hợp
với các đối tượng của lớp đó, nhưng đó là định nghĩa khơng có ý nghĩa
gì.

=0 nói cho compiler rằng hàm đó khơng có phần thân và hàm virtual trên sẽ được
gọi là hàm pure virtual function trong C++
22



×