Digital perform (Hàm ảo), override và closing

Digital perform (hàm ảo)

Digital perform giống như 1 hàm quá tải, nhưng điều đặc biệt trên đây là: kiểu dữ liệu, số lượng và kiểu dữ liệu của những tham số của hàm ảo trên cả 2 lớp cơ sở và dẫn xuất đều như nhau ! Hàm ảo là thành phần của 1 lớp, được khai báo trong lớp cơ sở rồi nhưng lại được khai báo lại trong lớp dẫn xuất có từ khoá “digital” trên đằng trước. Ko buộc phải tự động dưng người ta làm cho điều này vô ích, hàm ảo tạo nên tính đa hình trong c++ là bởi vì có thể nói 1 “giao diện” cho nhiều phương thức. Có nghĩa là có 1 thông điệp ấy thôi mà cho nhiều kết quả khác nhau lúc con trỏ của lớp cơ sở trỏ tới đối tượng của 1 lớp nào ấy (ko nói tới con trỏ của lớp dẫn xuất vì nó ko thể trỏ tới đối tượng của lớp cơ sở được !).

Để khai báo hàm ảo, bạn thêm từ khóa digital trước tên hàm. Hãy theo dõi dí dụ minh họa sau để hiểu hơn bí quyết hàm ảo làm cho việc.

Thí dụ:

#embrace<iostream> #embrace<conio.h> utilizing namespace std; class solar { public: digital void showcty() { cout<<“n Hien thi solar:”; } void show() { cout<<“n Trung bay solar:” ; } }; class kethua:public solar { public: void show() { cout<<“n Trung bay sun1:”; } void showcty() { cout<<“n Hien thi sun1:”; } }; int most important() { solar obj1; solar *p; cout<<“n P tro toi solar:n” ; p=&obj1; p->show(); p->showcty(); cout<<“nn P tro toi sun1:n”; kethua obj2; p=&obj2; p->show(); p->showcty(); return 0; }

Xem Thêm  Information Akali Mùa 11 Từ [A-Z]: Bảng Ngọc Bổ Trợ, Và Bí quyết Lên Đồ Cho Akali

Kết quả:

P tro toi solar: Trung bay solar: Hien thi solar: P tro toi sun1: Trung bay solar: Hien thi sun1:

Chú ý:

Còn 1 điều đáng chú ý nữa, hàm ảo này có thể ko được định nghĩa trong lớp cơ sở mà chỉ được khai báo thôi! VD: digital void setsun(int i)=0. Lúc này chúng ta gọi nó là “hàm ảo thuần tuý”.

Thí dụ tiếp theo:

#embrace <iostream> utilizing namespace std; class Solar { public: ~Solar() { cout << “That is Solar*” << endl; } }; class Sun1 : public Solar { public : ~Sun1() { cout << “That is Sun1” << endl; } }; int most important() { Solar* solar = new Sun1(); delete solar; return 0; }

Kết quả:

That is Solar*

Tại dí dụ trên hàm hủy của Sunclass ko được định nghĩa là digital nên lúc ta hủy con trỏ solar hàm hủy của Sun1 ko được gọi. Nên ta định nghĩa hàm hủy của Solar class là digital.

Override và closing

Override là việc viết lại 1 phương thức (methodology) trong lớp dẫn xuất (derived class) mà trên lớp cơ sở (base class).

Như chúng ta đã biết để lớp dẫn suất override 1 digital perform của base class thì 2 hàm buộc phải có cùng tên, cùng tham số và cùng kiểu dữ liệu trả về. Tuy nhiên trong nhiều trường hợp ta có thể xảy ra nhầm lẫn lúc override 1 digital perform.

Thí dụ:

class Solar { public: digital void Thongtin() { cout << “Day la ham thong tin cty SUN” << endl; } }; class CSun1 : public Solar { public: void Thongtin() const { cout << “Day la ham thong tin nhan vien Solar” << endl; } };

Xem Thêm  Khai quang là gì? Khai quang điểm nhãn là gì? – Hành Trình Trầm Hương

Trong dí dụ trên hàm CSun1::Thongtin khong co override hàm Solar::Thongtin vì hàm CSun1::Thongtin là const còn hàm Solar::Thongtin thì ko buộc phải.

Trong phiên bản C++11 có tương trợ thêm 1 từ khóa là override, ý nghĩa của từ khóa này sẽ giúp ta kiểm soát việc 1 hàm có thực sự là override 1 phương thức của lớp mà nó đang kế thừa hay ko, giả dụ ko tồn tại phương thức mà nó đang “nghĩ” rằng nó đang override tại lớp mà nó kế thừa thì trình biên dịch sẽ báo lỗi lúc biên dịch. Ta thêm từ khóa override vào cuối tên phương thức như sau.

class Solar { public: char* getThongtinsun(int signal) { if (signal > 0) { return “Solar”; } } }; class CSun1: public Solar { public: char* getThongtinsun(char signal) override { if (signal > 0) { return “CSun1”; } } };

Trong nhiều trường hợp ta ko muốn lớp dẫn suất override 1 digital perform trong base class. C++ 11 phân phối cho ta từ khóa closing để thực hành điều này. Digital perform được đánh dấu là closing sẽ ko cho phép override trên lớp dẫn suất. Trường hợp lớp dẫn suất vẫn override thì trình biên dịch sẽ báo lỗi.

Thí dụ :

class Solar { public: digital void Thongtin() closing { cout << “Day la ham thong tin cty Solar” << endl; } }; class CSun1 : public Solar { public: //Error void Thongtin() override { cout << “Day la ham thong tin nhan vien Solar” << endl; } };

Trên đây là 1 số tìm hiểu của tôi về Digital perform, override và closing cảm ơn người mua đã đọc.

Xem Thêm  Nautilus mùa 12: Phương pháp chơi, lên đồ & bảng ngọc Nautilus SP – Weblog Trần Văn Thông

Hyperlink tham khảo: