0
Tải bản đầy đủ (.doc) (133 trang)

Tính thừa kế trong lớp dẫn xuất

Một phần của tài liệu BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ DOC (Trang 82 -86 )

.I.3.1. Sự tương thích của đối tượng thuộc lớp dẫn xuất với đối tượng thuộc lớp cơ sở

Một cách tổng quát, trong lập trình hướng đối tượng, một đối tượng của lớp dẫn xuất có thể “thay thế” một đối tượng của lớp cơ sở. Nghĩa là: tất cả những thành phần dữ liệu có

trong lớp cơ sở đều tìm thấy trong lớp dẫn xuất; tất cả các hành động thực hiện được trên lớp cơ sở luôn luôn có thể làm được trên các lớp dẫn xuất. Trong chương trình inheri1.cpp ta

thấy rằng: đối tượng m của lớp coloredpoint có đồng thời hai thành phần toạ độ x , y và thêm thành phần dư liệu bổ sung color; ngoài ra có thể gọi các hàm thành phần point::display() và point::move(...) thông qua đối tượng m.

Tính tương thích giưa một đối tượng của lớp dẫn xuất và đối tượng lớp cơ sở được thể hiện ở chỗ có thể chuyển kiểu ngầm định từ một đối tượng của lớp dẫn xuất sang một đối

tượng của lớp cơ sở. Xét các chỉ thị sau:

point p; p.display(); coloredpointcol pc(2,3,5); câu lệnh p=pc; p.display(); pc.display();

Diem p khong mau

Goi ham point::display() Toa do :0 0

Diem pc co mau

Ham coloredpoint::display() Goi ham point::display() Toa do :2 3

Mau 5 p =pc

Goi ham point::display() Toa do :2 3

Tuy nhiên nhận xét trên đây không hoàn toàn đúng xét theo chiều ngược lại. Câu lệnh sau đây không đúng nếu không có định nghĩa chồng toán tử gán giưa hai đối tượng với các kiểu dư liệu coloredpoint và point.

pc=p;

Chú ý : Từ pc chỉ có thể gọi đến các thành phần hàm public trong lớp point (xem

thêm phần sau để hiểu rõ hơn).

.I.3.2. Thừa kế các thành phần dữ liệu (thuộc tính)

Các thuộc tính của lớp cơ sở đều được thừa kế trong lớp dẫn xuất. Trong lớp dẫn xuất gồm có thuộc tính vừa mới định nghĩa trong lớp dẫn xuất và thuộc tính của lớp cơ sở. Tuy nhiên, trong lớp dẫn xuất không có quyền truy nhập đến các thuộc tính private của lớp cơ sở. Cho phép đặt trùng tên các thuộc tính trong lớp cơ sở và lớp dẫn xuất.

Ví dụ: class A { private: int a, b; … }; class B { private: float a, b; … };

class C: public A, B { private: int b; char *a; … };

Lúc này lớp C sẽ có các thuộc tính: A::a; A::b (kiểu int) - thừa kế từ lớp A B::a; B::b (kiểu float) - thừa kế từ lớp B

A (kiểu char*) và b (kiểu int) - được định nghĩa trong C

Các phương thức trong C chỉ có quyền truy nhập trực tiếp đến các thuộc tính khai báo trong lớp C

.I.3.3.Thừa kế phương thức

Các phương thức trong lớp cơ sở đều được thừa kế trong lớp dẫn xuất, ngoại trừ: - Hàm tạo

- Hàm hủy - Toán tử gán

Ví dụ 5.4 #include <conio.h> #include <iostream.h> class Point { private:

int x,y; //toa do cua diem public:

Point() //ham thiet lap khong co tham so {

x = y =0; }

Point(int x1, int y1) //Ham thiet lap co tham so {

x = x1; y = y1; }

void display() {

cout<<”Toa do diem x= <<x<<” y= “<<y; }

};

class HINH_TRON: public Point {

private:

float R; public:

HINH_TRON():public Point() //Ham thiet lap khong co tham so

{

R=0.0; }

HINH_TRON(int x1,int y1,float R1):public Point(x1,y1) //Ham thiet lap co tham so

{ R=R1; } float getR() { return R; } }; void main() { HINH_TRON c(3, 4, 6); clrscr();

cout<<”Tam hinh tron: “; c.display();

cout<<”\n Ban kinh duong tron: “<<c.getR(); getch();

}

Một phần của tài liệu BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ DOC (Trang 82 -86 )

×