Phương thức tĩnh
1.1. Lời gọi tới phương thức tĩnh
Như đã biết một lớp dẫn xuất được thừa kế các phương thức của các lớp cơ sở tiền bối của
nó. Ví dụ lớp A là cơ sở của B, lớp B lại là cơ sở của C, thì C có 2 lớp cơ sở tiền bối là B và
A. Lớp C được thừa kế các phương thức của A và B. Các phương thức mà chúng ta vẫn nói là
các phương thức tĩnh. Để tìm hiểu thêm về cách gọi tới các phương thức tĩnh, ta xét ví dụ về
các lớp A, B và C như sau:
class A
{
public:
void xuat()
{
cout << "\n Lop A " ;
}
};
class B:public A
{
public:
void xuat()
{
cout << "\n Lop B " ;
}
};
class C:public B
{
public:
void xuat()
{
cout << "\n Lop C " ;
}
};
Quy tắc gọi phương thức tĩnh: Lời gọi tới phương thức tĩnh bao giờ cũng xác định rõ
phương thức nào (trong số các phương thức trùng tên của các lớp có quan hệ thừa kế) được
gọi:
1. Nếu lời gọi xuất phát từ một đối tượng của lớp nào, thì phương thức của lớp đó sẽ được
gọi.
2. Nếu lời gọi xuất phát từ một con trỏ kiểu lớp nào, thì phương thức của lớp đó sẽ được
gọi bất kể con trỏ chứa địa chỉ của đối tượng nào.
1.2. Ví dụ
Xét 4 lớp A, B, C và D. Lớp B và C có chung lớp cơ sở A. Lớp D dẫn xuất từ C. Cả 4 lớp
đều có phương thức xuat(). Xét hàm:
void hien(A *p)
{
p->xuat();
}
Không cần biết tới địa chỉ của đối tượng nào sẽ truyền cho đối con trỏ p, lời gọi trong hàm
luôn luôn gọi tới phương thức A::xuat() vì con trỏ p kiểu A. Như vậy bốn câu lệnh:
hien(&a);
hien(&b);
hien(&c);
319 320
hien(&d);
trong hàm main (của chương trình dưới đây) đều gọi tới A::xuat().
//CT6-01
// Phuong thuc tinh
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <ctype.h>
class A
{
{
cout << "\nLop B: "<<getN();
}
};
class C:public A
{
public:
C():A()
{
}
C(int n1):A(n1)
{
}
void xuat()
{
cout << "\nLop C: "<<getN();
}
};
class D:public C
{
public:
D():C()
{
}
D(int n1):C(n1)
{
}
void xuat()
{
cout << "\nLop D: "<<getN();