phương thức này, thì phương thức của lớp dẫn xuất sẽ ẩn tất cả các phương thức của lớp cơ sở có cùng tên với nó... Chồng toán tử[r]
(1)(2)Nội dung chính
Đa hình đặc trưng ngơn ngữ
lập trình hướng đối tượng
Đa hình tĩnh
Chồng hàm
Chồng toán tử
Đa hình động
(3)1 Chồng hàm
Là kỹ thuật sử dụng:
Các hàm tên
Danh sách tham số khác
Danh sách tham số phân biệt theo:
kiểu liệu tham số thứ tự tham số
số lượng tham số
(4)(5)Overriding function
Overload phương thức, tức tạo
ra nhiều phương thức có tên
nhưng khác danh sách tham số
Override phương thức, tức tạo
một phương thức lớp dẫn xuất có prototype với phương thức
(6)Ví dụ: Overriding function
class Mammal {
public:
void Speak() {cout << “Mamal”;} };
class Dog : public Mammal {
public:
void Speak() {cout << “Dog”;} };
int main() {
Mamal m; Dog d;
m.Speak(); // Mamal
d.Speak(); // Dog
(7)Ẩn phương thức lớp sở
Nếu lớp sở có phương thức bị
chồng lớp dẫn xuất lại override
(8)Ví dụ: Ẩn phương thức lớp sở
class Mammal {
public:
void Move() {cout << “Mamal moves step”;}
void Move(int d) {cout << “Mamal moves <<d<<“ steps”;} };
class Dog : public Mammal {
public:
void Move() {cout << “Dog moves step”;} }; int main() { Mamal m; Dog d; m.Move(); m.Move(10); d.Move();
d.Move(10); // lỗi
(9)2 Chồng toán tử
Chồng toán tử cho phép thực
phép tính kiểu liệu người sử dụng tự định nghĩa
tương tự kiểu liệu khác
Cú pháp khai báo chồng toán tử:
(10)2.1 Chồng toán tử toán hạng
Hàm chồng toán tử tốn hạng
khơng có tham số
Ví dụ: chồng tốn tử ++ (tiền tố
(11)(12)2.2 Chồng toán tử toán hạng
Hàm chồng toán tử hai tốn hạng có
một tham số
Tham số tốn hạng phía bên
phải toán tử
Hàm chồng toán tử viện dẫn
(13)(14)2.3 Chồng toán tử quan hệ
class Date {
bool operator==(Date d) {
return (day==d.day) && (month==d.month) && (year==d.year); };
bool operator<(Date d) {
if (year < d.year) return true; else
if (year==d.year) && (month < d.month) return true;
else
(15)3 Hàm ảo
Khi hàm định nghĩa hàm ảo lớp
sở định nghĩa lại lớp dẫn xuất
Khi sử dụng hàm ảo?
Lớp Parent Child có phương thức f
Khai báo trỏ thuộc kiểu lớp Parent
Parent* p;
Con trỏ trỏ đến đối tượng lớp Child
p = new Child;
Sau đó, thực lời gọi
p->f;
(16)Ví dụ: Không sử dụng hàm ảo class Mammal
{
public:
void Move() {cout << “Mammal moves step”;} };
class Dog : public Mammal {
public:
void Move() {cout << “Dog moves step”;} };
int main() {
Mamal* p = new Dog();
(17)Ví dụ: Sử dụng hàm ảo
class Mammal {
public:
void virtual Move() {cout << “Mammal moves step”;} };
class Dog : public Mammal {
public:
void Move() {cout << “Dog moves step”;} };
int main() {
(18)Hàm ảo
Lớp sở trừu tượng lớp sở
đối tượng sử dụng lớp khác kế thừa
Hàm ảo khai báo lớp làm
cho lớp trở thành lớp sở trừu tượng
virtual kiểu_trả_về tên_hàm(danh sách tham số) = 0;
Tất lớp dẫn xuất phải định nghĩa
(19)Ví dụ: hàm ảo class Mammal
{
public:
virtual void Move() = 0; };
class Dog : public Mammal {
public:
void Move() {cout << "Dog moves step";} };
void main() {