1. Truy nhập các thành phần trong lớp dẫn xuất
Các thành phần của lớp dẫn xuất (derived class) gồm các thành phần khai báo trong lớp dẫn xuất và các thành phần kế thừa được từ lớp cơ sở. Các đối tượng của lớp dẫn xuất có thể truy cập các thành phần của nó thông qua toán tử chấm “.”.
#include <iostream>
using namespace std;
class A{
private:
int biena;
public:
void hama(){
biena = 0;
cout<<"Gia tri cua bien a = "<<biena<<endl;
}
};
class B: public A{
private:
int bienb;
public:
void hamb(){
bienb = 1;
cout<<"Gia tri cua bien b = "<<bienb<<endl;
}
};
void main(){
B bobject;
//truy cập các thành viên
bobject.hama();
bobject.hamb();
system("pause");
}
Kết quả
Gia tri cua bien a = 0
Gia tri cua bien b = 1
2. Định nghĩa lại hàm thành phần của lớp cơ sở trong lớp dẫn xuất
Trong lớp dẫn xuất (derived class) có thể định nghĩa lại hàm thành phần của lớp cơ sở mà nó thừa kế được. Như vậy, sẽ có hai phiên bản khác nhau của hàm thành phần trong lớp dẫn xuất. Trong phạm vi lớp dẫn xuất, hàm định nghĩa lại trong lớp dẫn xuất sẽ ghi đè (overriding) lên hàm được định nghĩa trong lớp cơ sở.
#include <iostream>
using namespace std;
class A{
private:
int biena;
public:
void hama(){
biena = 0;
cout<<"Gia tri cua bien a = "<<biena<<endl;
}
void nhap(){
cout << "\nNhap gia tri cua bien a = "; cin >> biena;
}
void hienthi(){
cout<<"\nGia tri cua bien a = "<<biena;
}
};
class B: public A{
private:
int bienb;
public:
void hamb(){
bienb = 1;
cout<<"Gia tri cua bien b = "<<bienb<<endl;
}
void nhap(){
cout << "\nNhap gia tri cua bien b = "; cin >> bienb;
}
};
void main(){
B bobject;
bobject.nhap();
bobject.A::nhap();
system("pause");
}
Kết quả
Nhap gia tri cua bien b = 5
Nhap gia tri cua bien a = 9
Trong ví dụ trên, lớp B kế thừa public từ lớp A. Lớp B định nghĩa lại hàm nhap() kế thừa được từ lớp A. Lúc này, đối tượng của lớp B là bobject gọi hàm nhap() bằng toán tử chấm “.” với lệnh bobject.nhap(). Hàm nhap() được gọi là hàm nhap() được định nghĩa lại trong B.
Nếu bobject muốn gọi hàm nhap() của lớp A thì phải dùng lệnh bobject.A::nhap(). Tức là phải chỉ rõ hàm nhap() thuộc lớp cơ sở A.
3. Hàm khởi tạo và hàm hủy trong kế thừa
Các hàm khởi tạo (constructor) của lớp cơ sở không được kế thừa. Tuy nhiên, một đối tượng của lớp dẫn xuất về thực chất có thể xem là một đối tượng của lớp cơ sở. Vì vậy, việc gọi hàm khởi tạo lớp dẫn xuất để tạo đối tượng của lớp dẫn xuất sẽ kéo theo việc gọi đến một hàm khởi tạo của lớp cơ sở. Hàm khởi tạo của lớp cơ sở được gọi trước rồi đến hàm khởi tạo của lớp dẫn xuất.
Hàm hủy (destructor) của lớp cơ sở cũng không được kế thừa. Hàm hủy của lớp dẫn xuất thực thi trước hàm hủy của lớp cơ sở.
#include <iostream>
using namespace std;
class LopCoSo{
public:
LopCoSo(){
cout << "Ham khoi tao cua lop co so!" << endl;
}
~LopCoSo(){
cout << "Ham huy cua lop co so!" << endl;
}
};
class LopDanXuat : public LopCoSo{
public:
LopDanXuat(){
cout << "Ham khoi tao cua lop dan xuat!" << endl;
}
~LopDanXuat(){
cout << "Ham huy cua lop dan xuat!" << endl;
}
};
void main(){
LopDanXuat obj;
}
Kết quả
Ham khoi tao cua lop co so!
Ham khoi tao cua lop dan xuat!
Ham huy cua lop dan xuat!
Ham huy cua lop co so!