Lớp dẫn xuất (derived class) trong lập trình hướng đối tượng với C++

Đây là bài 14/19 bài của series môn học Phương pháp lập trình hướng đối tượng

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ấtcá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 Bbobject 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!
5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Dẫn xuất public, protected, private trong kế thừa và minh họa với C++C++ hỗ trợ đa kế thừa trong lập trình hướng đối tượng >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.