Mọi lớp đều có thể là lớp cơ sở Lớp dẫn xuất có thể là lớp cơ sở của 1 lớp khác Xác định sự phân cấp các lớp... ừ ế Về nguyên tắc, mọi thành phần của lớp cơ sở được thừa kế bởi lớp d
Trang 1Lập trình hướng đối tượng
Bài 5: Thừa kế
Trang 3Giới thiệu
Cho phép tạo lớp mới dẫn xuất từ lớp đã có
Point
Circle 3D-Point Point
3D-Point Sphere
Base class/supper class/ parent class
Devived class/ subclass/ child class
Trang 5Rectangle Triangle
Polygon
class Polygon{
Trang 6Rectangle Triangle
Polygon
class Polygon{
Trang 7Khái ni m th a k ệ ừ ế
Point Circle 3D-Point
class Point{
x y r
x y z
Trang 8 Mở rộng lớp gốc
Cá biệt hóa lớp gốc
RealNumber
ComplexNumber
3D-Point
Trang 10 Mọi lớp đều có thể là lớp cơ sở
Lớp dẫn xuất có thể là lớp cơ sở của 1 lớp khác
Xác định sự phân cấp các lớp
Trang 11S d n xu t l p ự ẫ ấ ớ
Point 3D-Point
Sphere
Point là lớp cơ sở của 3D-Point, trong khi 3D-Point là lớp cơ sở của Sphere
Trang 12Th a k là gì? ừ ế
Về nguyên tắc, mọi thành phần của lớp cơ sở được thừa kế bởi lớp dẫn xuất
có thể với quyền truy cập khác
Trang 13Đi u khi n truy c p các thành ph n ề ể ậ ầ
Trang 14Quyền truy cập của lớp dẫn xuất
private protected public
protected private protected protected
public private protected public
Trang 15Th a k nh ng thành ph n nào? ừ ế ữ ầ
Về nguyên tắc, mọi thành phần của lớp cơ sở được thừa kế bởi lớp dẫn xuất
Chỉ với quyền truy cập khác
Tuy nhiên, có các ngoại lệ
Thiết lập và hủy bỏ
operator=()
Bạn bè
Do các hàm này là xác định theo lớp
Trang 16Các luật thiết lập của lớp dẫn xuất
Thiết lập và hủy bỏ mặc định được gọi khi đối tượng mới của lớp dẫn xuất
được tạo hoặc hủy bỏ.
class A {
public:
A ( ) {cout<< “A:default”<<endl;}
A (int a) {cout<<“A:parameter”<<endl;}
}
class B : public A {
public:
B (int a) {cout<<“B”<<endl;}}
B test(1); output: A:default B
Trang 17Các luật thiết lập của lớp dẫn xuất
Có thể xác định thiết lập của lớp cơ sở khác hơn thiết lập mặc định
public:
C (int a) : A(a)
{cout<<“C”<<endl;}}
Trang 18Xác đ nh các thành ph n riêng ị ầ
Point Circle
Trang 19Th m chí nhi u h n … ậ ề ơ
được xác định bởi lớp cha Với việc viết chồng,
Phương thức của lớp con có ký hiệu xác định tới phương
public:
void print () {cout<<“From B”<<endl;}}
Trang 20Truy c p ph ng th c ậ ươ ứ
Circle C;
C.set(10,10,100); // from class Circle
C foo (); // from base class Point
C print (); // from class Circle
Point A;
A set (30,50); // from base class Point
A print (); // from base class Point
Trang 21Đ t chúng cùng nhau ặ
thuộc tính thừa kế public
lớp cơ sở, trừ phương thức thiết lập
public và protected của lớp cơ sở
Trang 22void Write ( ) const ;
Time ( int initH, int initM, int initS ) ; // constructor
Time ( ) ; // default constructor
Trang 23Biểu đồ giao diện lớp
Protected data:
hrs mins secs
Set Increment Write Time Time
Time class
Trang 24Lớp dẫn xuất ExtTime
// SPECIFICATION FILE ( exttime.h)
#include “time.h”
enum ZoneType {EST, CST, MST, PST, EDT, CDT, MDT, PDT } ;
class ExtTime : public Time
// Time is the base class and use public inheritance
{
public :
void Set ( int h, int m, int s, ZoneType timeZone ) ;
void Write ( ) const; //overridden
ExtTime (int initH, int initM, int initS, ZoneType initZone ) ;
ExtTime (); // default constructor
private :
ZoneType zone ; // added data member
} ;
Trang 25Biểu đồ giao diện lớp
Protected data:
hrs mins secs
ExtTime class
Set Increment Write Time Time
Set Increment Write ExtTime
ExtTime
Private data:
zone
Trang 26Thể hiện của ExtTime
The default constructor of
base class, Time(), is
automatically called, when an
ExtTime object is created.
ExtTime et1;
hrs = 0 mins = 0 secs = 0 zone = EST et1
Trang 27Thể hiện của ExtTime
5000
???
6000 5000
Trang 28Thể hiện của ExtTime
void ExtTime :: Set (int h, int m, int s, ZoneType timeZone)
Trang 29Làm việc với ExtTime
Trang 30point(float ox, float oy) {x=ox; y=oy;}
point(point &p) {x=p.x; y=p.y;}
Trang 31Thí dụ
class coloredpoint:public point{
unsigned int color;
Trang 32Color: 5adp = &pcadp->move(2,3)Function coloredpoint::display()Call function point::display()Coordinate: 4, 6
Color: 5Call function point::display()Coordinate: 4, 6
Tương tự với tham chiếu
Trang 33Tính đa hình và hàm ảo
Giới thiệu tính đa hình
Khả năng thực hiện các công việc khác nhau trước cùng một thông báo
Là đặc điểm bản chất của ngôn ngữ HĐT
Được xây dựng dựa trên khả năng thừa kế
Được gọi là “ Late Binding ”
Thể hiện trong C++ sử dụng hàm ảo (virtual
functions)
Trang 34Biểu đồ giao diện lớp
Protected data:
hrs mins secs
ExtTime class
Set Increment Write Time Time
Set Increment Write ExtTime
ExtTime
Private data:
zone
Time class
Trang 35Tại sao đa hình?—Xem xét:
Time and ExtTime Example by Inheritance
void Print (Time someTime ) //pass an object by value
// Time :: write()
Trang 36Liên kết tĩnh
tham số thực sự có thể là:
cùng dạng với dạng chính tắc, hoặc,
dạng dẫn xuất nào đó.
Liên kết tĩnh được xác định lúc dịch
Khi đưa qua bởi giá trị, liên kết tĩnh xảy ra
Trang 37// Time :: write()
Trang 38Liên kết động
dựa vào đối số thực sự
xây dựng mã xác định liên kết động
pass-by-reference
Trang 40Time::write() ExtTime::write()
Trang 41Các hàm ảo
Hàm ảo khắc phục vấn đề xác định đối tượng thời gian chạy
liên kết trễ và trì hoãn thể hiện đối tượng
Xác định hàm ảo ở lớp cơ sở Từ khóa virtual chỉ ở lớp cơ sở
Hàm ảo ở lớp cơ sở sẽ là ảo ở tất cả các lớp dẫn xuất
Hàm ảo có thể được viết chồng ở lớp dẫn xuất
Nhưng không bắt buộc lớp dẫn xuất phải thể hiện lại hàm
ảo Nếu nó không thể hiện lại, phiên bản của lớp cơ sở được sử dụng
Trang 42Tổng kết tính đa hình:
thêm thông tin về các dạng của đối tượng
được tạo
Tính đa hình được hỗ trợ nhờ thông tin bổ
sung này
Hàm ảo làm việc chỉ với con trỏ hay tham chiếu
Nếu lớp có hàm ảo, phương thức hủy bỏ của lớp nên được khai báo là ảo
Trang 43Lớp trừu tượng và hàm thuần ảo
Một số lớp tồn tại lôgíc nhưng không tồn tại vật lý
Shape s; // Legal but silly !! : “Shapeless shape”
Shape chỉ được sử dụng như là lớp cơ sở cho một số lớp khác Nó được sử dụng như một sự phân nhóm
Do đó, không có thể hiện của lớp
class Shape //Abstract
{
public :
virtual void draw() = 0;
}
L p có 1 hay nhi u hàm thu n o g i ớ ề ầ ả ọ
là l p tr u t ng ớ ừ ượ (Abstract Class)
Không th t o đ i t ng c a l p ể ạ ố ượ ủ ớ thu n o ầ ả
Trang 45 Hàm thuần ảo không được xác định trong lớp dẫn xuất sẽ duy trì là hàm thuần ảo.
}
Trang 47Tổng kết … tiếp tục
lớp dẫn xuất, nhưng phần mã chung có thể được giữ
ở lớp cơ sở cho mục đích sử dụng lại
Shape::draw(); //Reuse
cout <<“Rectangle”<< endl; }
Trang 50Lớp cơ sở ảo
Tình huống:
DA
class A {
int x,y;
};
class B:public A{ };
class C:public A{ };
class D:public B, public C{ };
Trang 51Lớp cơ sở ảo
class B:public virtual A{ };
class C:public virtual A{ };
class D:public B, public C{ };