Hàm ảo thực sự và lớp trừu tợng (pure function &

Một phần của tài liệu Lập trình hướng đối tượng (Trang 142 - 144)

function & abstract class)

Nếu một lớp chỉ bao gồm các hàm rỗng thì việc thể hiện các đối tợng sẽ không có ý nghĩa gì trong lập trình vì ngoài việc phân phối bộ nhớ không cần thiết, các đối tợng sẽ không thực hiện bất cứ điều gì. Để tránh tạo ra các đối t- ợng có dạng trên, các lớp cần khai báo dạng lớp trừu tợng (abstract class). Một lớp trừu tợng có ít nhất một hàm rỗng và trong số các hàm rỗng phải có ít nhất một hàm ảo thực

sự (Pure virtual function). Lớp trừu tợng với các hàm ảo

thực sự tạo ra một cơ chế lớp bao, nghĩa là một lớp tổng quát nhất bao tất cả các lớp còn lại và do đó thực hiện triệt để nguyên lý trừu tợng hóa trong kỹ thuật kế thừa.

Chú ý rằng không đợc phép có lệnh gọi thực hiện các hàm ảo thực sự này. Vì, việc gọi một hàm ảo thực sự là tơng đơng với việc sử dụng một con trỏ cha đợc khởi tạo để gọi gián tiếp hàm đó và nh thế là không đợc phép.

Ví dụ 6

#include <iostream.h> #include <conio.h> class A{

public:

virtual void display() = 0 ; ham ao tinh khiet kieu pure function

};

class B: public A { public:

virtual void display() { cout<<"\n Class B";} };

class C: public B { public:

virtual void display() { cout<<"\n Class C";} };

void show(A* a) { a-> display(); } void main() {

B* b = new B; C* c = new C;

show(b); // goi ham B::display() show(c); // goi ham C::display() }

Lớp A đợc sử dụng nhờ một lớp cơ sở cho tất cả các lớp khác. Hàm ::show(A*) nào đợc gọi sẽ đợc xác định cụ thể khi chơng trình dựa trên các kiểu của đối tợng đợc truyền cho hàm.

Việc dẫn suất một lớp từ một lớp trừu tợng không có nghĩa là lớp đó đợc thể hiện. Nếu một lớp đợc dẫn xuất từ lớp khác mà bản thân lớp cơ sở lại chứa các hàm ảo thực sự thì lớp dẫn xuất cũng đợc xem nh lớp trừu tợng. Bằng cách này C++ đòi hỏi dịch chuyển (định nghĩa chồng) tất cả các hàm ảo thực sự trong lớp dẫn xuất.

Một phần của tài liệu Lập trình hướng đối tượng (Trang 142 - 144)

Tải bản đầy đủ (DOC)

(174 trang)
w