Tính kế thừa-2. Bởi: Thanh Hiền Vũ. Định nghĩa lại các thành viên lớp cơ sở trong một lớp dẫn xuất:

Similar documents
Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

Hướng dẫn cài đặt FPT

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Tình huống 1: PPPoE với Username và Password

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Entity Framework (EF)

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

Chương 5. Network Layer 19/09/2016 1

Tài liệu hướng dẫn: Stored Procedure

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

BẢO MẬT TRONG SQL SERVER

Nhấn nút New để tạo 1 biến mới Trang 17

LÂ P TRI NH WEB ASP.NET

TỔNG QUAN VỀ.NET VÀ C#

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Time Picker trong Android

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

SIMULATE AND CONTROL ROBOT

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

STACK và QUEUE. Lấy STACK

Bài 10: Cấu trúc dữ liệu

SIEMENS INDUSTRIAL NETWORKS

Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ. Những hỗ trợ tiên tiến khác của SQL. Đỗ Thanh Nghị

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

LAB IP SLA Bài 1. Bùi Quốc Kỳ ***

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Cập nhật ResultSet trong JDBC

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

Bài 7: Các cấu trúc điều khiển

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

I. Hướng Dẫn Đăng Nhập:

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

CẤU TRÚC DỮ LIỆU NÂNG CAO

Mô hình dữ liệu quan hệ (Relational data model)

Tạo Project với MPLAB

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

Phần 1: Hướng dẫn sử dụng PictureBox tạo Slide Show

Đa ngôn ngữ (Internationalization) trong Servlet

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

BELGIUM ONLINE APPOINTMENT

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

GV: Phạm Đình Sắc or

Exceptions. Outline 7/31/2012. Exceptions. Exception handling is an important aspect of objectoriented. Chapter 10 focuses on:

CHƯƠNG 5: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG VB.NET

Bài thực hành số 2 QUYỀN và ROLE

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Parallels Cloud Server 6.0

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

Dọn "rác" Windows 7 vào dịp cuối năm

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Hướng Dẫn Thực Hành Tập tin & Thư mục

PHÁT TRIỂN ỨNG DỤNG WEB

Tìm hiểu Group Policy Object và các ví dụ

Bài 9: Kế thừa (Inheritance) EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

1 Bước 1: Test thử kit LaunchPad.

Lecture 12. Trees (1/2) Nội dung bài học:

Bài tập lớn số 1. Giả lập bộ định thời

HƯỚNG DẪN SỬ DỤNG NHANH MINDJET MIND MANAGER

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

Các kiểu định địa chỉ họ MSC-51

B6: Time to coding. Đi tới src\at.exam tạo một class mới là CustomViewGroup với nội dung sau: Mã: package at.exam;

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

JAVASCRIPT. Giảng viên : Ths. PHẠM ĐÀO MINH VŨ

CHAPTER 6: DANH SÁCH LIÊN KẾT (LINKED LISTS)

LINQ TO SQL & ASP.NET

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

- Chạy file cài đặt: kerio-kwf-whql win32.exe. Hộp thoại Choose Setup Language chọn English (United States), chọn

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

2.1. Upcasting. Chương 9. Đa hình (Polymophism) Chương 9. Đa hình (Polymophism) Chương 9. Đa hình (Polymophism)

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

LỖI LÚC THỰC THI và QUÁ TRÌNH GOM RÁC

Hệ điều hành Bài tập tuần 7_ Chúng ta làm quen một số lệnh thao tác với hệ thống file trong Linux :

Lập trình chuyên nâng cao. Lập trình phân tán (Distributed computing

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Các phiên bản SNMP. Chương 4

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Chương 3 Tập lệnh họ MSC-51

Transcription:

Tính kế thừa-2 Bởi: Thanh Hiền Vũ Định nghĩa lại các thành viên lớp cơ sở trong một lớp dẫn xuất: Một lớp dẫn xuất có thể định nghĩa lại một hàm thành viên lớp cơ sở. Điều này được gọi là overriding. Khi hàm đó được đề cập bởi tên trong lớp dẫn xuất, phiên bản của lớp dẫn xuất được chọn một cách tự động. Toán tử định phạm vi có thể sử dụng để truy cập phiên bản của lớp cơ sở từ lớp dẫn xuất. Ví dụ 5.2: Định nghĩa một hàm thành viên lớp cơ sở trong lớp dẫn xuất và project có tên là CT5_2.PRJ File EMPLOY.H EMPLOY.H 1: //EMPLOY.H2: //Định nghĩa lớp Employee3: #ifndef EMPLOY_H4: #define EMPLOY_H5:6: class Employee7: {8: private:9: char *FirstName;10: char *LastName;11: public:12: Employee(const char *First, const char *Last);13: void Print() const;14: ~Employee();15: };16:17: #endif File EMPLOY.CPP EMPLOY.CPP 1: //EMPLOY.CPP2: //Định nghĩa các hàm thành viên của lớp Employee3: #include <string.h>4: #include <iostream.h>5: #include <assert.h>6: #include "employ.h"7:8: Employee::Employee(const char *First, const char *Last)9: {10: FirstName = new char[ strlen(first) + 1 ];11: assert(firstname!= 0);12: strcpy(firstname, First);13: LastName = new char[ strlen(last) + 1 ];14: assert(lastname!= 0);15: strcpy(lastname, Last);16: }17:18: void Employee::Print() 1/8

const19: {20: cout << FirstName << ' ' << LastName;21: }22:23: Employee::~Employee()24: {25: delete [] FirstName;26: delete [] LastName;27: } File HOURLY.H HOURLY.H 1: //HOURLY.H2: //Định nghĩa lớp HourlyWorker3: #ifndef HOURLY_H4: #define HOURLY_H5:6: #include "employ.h"7:8: class HourlyWorker : public Employee9: {10: private:11: float Wage; //Tiền lương cho mỗi giờ12: float Hours; //Số giờ làm việc cho một tuần13: public:14: HourlyWorker(const char *First, const char *Last,15: float InitHours, float InitWage);16: float GetPay() const; //Tính toán và trả về lương17: void Print() const; //Định nghĩa lại Print() của lớp cơ sở18: };19:20: #endif File HOURLY.CPP HOURLY.CPP 1: //HOURLY.CPP2: //Định nghĩa các hàm thành viên của lớp HourlyWorker3: #include <iostream.h>4: #include <iomanip.h>5: #include "hourly.h"6:7: HourlyWorker::HourlyWorker(const char *First, const char *Last,8: float InitHours, float InitWage)9: : Employee(First, Last)10: {11: Hours = InitHours;12: Wage = InitWage;13: }14:15: float HourlyWorker::GetPay() const16: {17: return Wage * Hours;18: }19:20: void HourlyWorker::Print() const21: {22: cout << "HourlyWorker::Print()" << endl;23: Employee::Print(); //Gọi hàm Print() của lớp cơ sở24: cout << " is an hourly worker with pay of"25: << " $" << setiosflags(ios::showpoint)26: << setprecision(2) << GetPay() << endl;27: } 2/8

File CT5_2.CPP CT5_2.CPP 1: //CT5_2.CPP2: #include <iostream.h>3: #include "hourly.h"4:5: int main()6: {7: HourlyWorker H("Bob", "Smith", 40.0, 7.50);8: H.Print(); //Gọi hàm HourlyWorker::Print()9 cout<<endl<<"employee::print()<<endl;10: H.Employee::Print();11: return 0;12: } Chúng ta chạy ví dụ 5.2, kết quả ở hình 5.5 Hình 5.5: Kết quả của ví dụ 5.2 Ví dụ 5.3: Định nghĩa một thành viên dữ liệu của lớp cơ sở trong lớp dẫn xuất. CT5_3.CPP 1: //Chương trình 5.32: #include <iostream.h>3: class Base4: {5: protected:6: int Value;7: public:8: Base(int X)9: {10: Value = X;11: }12: };13:14: class Derived : public Base15: {16: private:17: int Value; //Định nghĩa lại thành viên dữ liệu18: public:19: Derived(int X):Base(X-1)20: {21: Value=X;22: }23: void Print() const24: {25: cout<<"base::value="<<base::value<<endl;26: cout<<"derived::value="<<value<<endl;27: }28: };29:30:31: int main()32: {33: Derived D(30);34: D.Print();35: return 0;36: } 3/8

Chúng ta chạy ví dụ 5.3, kết quả ở hình 5.6 Hình 5.6: Kết quả của ví dụ 5.3 Các lớp cơ sở public, protected và private Khi dẫn xuất một lớp từ một lớp cơ sở, lớp cơ sở có thể được kế thừa là public, protected và private. class <drived_class_name> : <type_of_inheritance> <base_class_name> {.. }; Trong đó type_of_inheritance là public, protected hoặc private. Mặc định là private. Khi dẫn xuất một lớp từ một lớp cơ sở public, 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 dẫn xuất, 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 dẫn xuất. Các thành viên private của lớp cơ sở không bao giờ được truy cập trực tiếp từ một lớp dẫn xuất. Khi dẫn xuất một lớp từ một lớp cơ sở protected, 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 dẫn xuất. Khi dẫn xuất một lớp từ một lớp cơ sở private, 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 dẫn xuất. Bảng sau (hình 5.6)tổng kết khả năng truy cập các thành viên lớp cơ sở trong một lớp dẫn xuất dựa trên thuộc tính xác định truy cập thành viên của các thành viên trong lớp cơ sở và kiểu kế thừa. Kiểu kế thừa 4/8

Kế thừa public Kế thừa protected Kế thừa private public public trong lớp dẫn các hàm friend và các hàm không thành viên. protected trong lớp dẫn xuất.có thể truy cập trực tiếp bởi các hàm thành viên không tĩnh, các hàm friend. private trong lớp dẫn các hàm friend. protected protected trong lớp dẫn xuất.có thể truy cập trực tiếp bởi các hàm thành viên không tĩnh, các hàm friend. protected trong lớp dẫn xuất.có thể truy cập trực tiếp bởi các hàm thành viên không tĩnh, các hàm friend. private trong lớp dẫn các hàm friend. private Dấu trong lớp dẫn các hàm friend thông qua các hàm thành viên public và protected của lớp cơ sở. Dấu trong lớp dẫn các hàm friend thông qua các hàm thành viên public và protected của lớp cơ sở. Dấu trong lớp dẫn các hàm friend thông qua các hàm thành viên public và protected của lớp cơ sở. Hình 5.7: Tổng kết khả năng truy cập thành viên lớp cơ sở trong lớp dẫn xuất. Các contructor và destructor lớp dẫn xuất Bởi vì một lớp dẫn xuất kết thừa các thành viên lớp cơ sở của nó (ngoại trừ constructor và destructor), khi một đối tượng của lớp dẫn xuất được khởi động, constructor lớp cơ sở phải được gọi để khởi động các thành viên lớp cơ sở của đối tượng lớp dẫn xuất. Một bộ khởi tạo lớp cơ sở (sử dụng cú pháp giống như bộ khởi tạo thành viên) có thể được cung cấp trong constructor lớp dẫn xuất để gọi tường minh constructor lớp cơ sở, mặt khác constructor lớp dẫn xuất sẽ gọi constructor mặc định lớp cơ sở. Các constructor lớp cơ sở và các toán tử gán lớp cơ sở không được kế thừa bởi lớp dẫn xuất.tuy nhiên, các constructor và các toán tử gán lớp dẫn xuất có thể gọi các constructor và các toán tử gán lớp cơ sở. Một constructor lớp dẫn xuất luôn gọi constructor lớp cơ sở của nó đầu tiên để khởi tạo các thành viên lớp cơ sở của lớp dẫn xuất. Nếu constructor lớp dẫn bị bỏ qua, constructor mặc định lớp dẫn gọi constructor lớp cơ sở. Các destructor được gọi theo thứ tự ngược 5/8

lại thứ tự gọi các constructor, vì thế destructor lớp dẫn xuất được gọi trước destructor lớp cơ sở của nó. Ví dụ 5.4: Minh họa thứ tự các contructor và destructor lớp cơ sở và lớp dẫn xuất được gọi và project có tên là CT5_4.PRJ File POINT.H POINT.H 1: //POINT.H2: //Định nghĩa lớp Point3: #ifndef POINT_H4: #define POINT_H5:6: class Point7: {8: public:9: Point(float A= 0.0, float B= 0.0);10: ~Point();11: protected:12: float X, Y;13: };14:15: #endif File POINT.CPP POINT.CPP 1: //POINT.CPP2: //Định nghĩa các hàm thành viên lớp Point3: #include <iostream.h>4: #include "point.h"5:6: Point::Point(float A, float B)7: {8: X = A;9: Y = B;10: cout << "Point constructor: "11: << '[' << X << ", " << Y << ']' << endl;12: }13:14: Point::~Point()15: {16: cout << "Point destructor: "17: << '[' << X << ", " << Y << ']' << endl;18: } File CIRCLE.H CIRCLE.H 1: //CIRCLE.H2: //Định nghĩa lớp Circle3: #ifndef CIRCLE_H4: #define CIRCLE_H5:6: #include "point.h"7: #include <iomanip.h>8:9: class Circle : public Point10: {11: public:12: Circle(float R = 0.0, float A = 0, float B = 0);13: ~Circle();14: private:15: float Radius;16: };17:18: #endif 6/8

File CIRCLE.CPP CIRCLE.CPP 1: //CIRCLE.CPP2: //Định nghĩa các hàm thành viên lớp Circle3: #include "circle.h"4:5: Circle::Circle(float R, float A, float B): Point(A, B)6: {7: Radius = R;8: cout << "Circle constructor: Radius is "9: << Radius << " [" << A << ", " << B << ']' << endl;10: }11:12: Circle::~Circle()13: {14: cout << "Circle destructor: Radius is "15: << Radius << " [" << X << ", " << Y << ']' << endl;16: } File CT5_4.CPP CT5_4.CPP 1: //CT5_4.CPP2: //Chương trình 5.43: #include <iostream.h>4: #include "point.h"5: #include "circle.h"6: int main()7: {8: {9: Point P(1.1, 2.2);10: }11: cout << endl;12: Circle C1(4.5, 7.2, 2.9);13: cout << endl;14: Circle C2(10, 5, 5);15: cout << endl;16: return 0;17: } Chúng ta chạy ví dụ 5.4, kết quả ở hình 5.8 7/8

Hình 5.8: Kết quả của ví dụ 5.4 8/8