Nội dung:
I. KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.
II. ÁP DỤNG CHO BÀI TOÁN QUẢN LÝ SINH VIÊN.
Cách 1: kế thừa.
Cách 2: Đa hình (kế thừa và đa hình)
I. KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.
2. Những đặc tính chủ yếu:
Tập trung vào dữ liệu thay cho các chức năng.
Chương trình được chia thành các đối tượng chứa trong các lớp.
Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng.
Các hàm xác định trên các vùng dữ liệu của đối tượng được gắn với nhau trên cấu trúc dữ liệu đó.
Dữ liệu được bao bọc, che giấu và không cho phép các hàm ngoại lai truy nhập tự do (các mức độ truy cập: private – bên trong phạm vi của lớp, protected – trong lớp và lớp kế thừa, public – truy cập được cả trong và ngoài lớp).
Các đối tượng trao đổi với nhau thông qua các hàm.
Dữ liệu và các hàm mới có thể dễ dàng bổ sung vào đối tượng nào đó khi cần thiết.
Chương trình được thiết kế theo cách tiếp cận bottom-up (dưới-lên).
3. Kỹ thuật hướng đối tượng.
Trừu tượng hoá thông tin: chỉ tập trung vào những đặc trưng chính chứ không thể xem xét tất cả; nghĩa là chúng ta đã sử dụng nguyên lý trừu tượng hoá:
Lớp (class): là kiểu dữ liệu trừu tượng, tập hợp các đối tượng có chung các thuộc tính (mô tả đối tượng cần quản lý) và phương thức xử lý dữ liệu.
Đối tượng (Object): là thực thể mà trong đó các dữ liệu và các phương thức thao tác lên dữ liệu đã được đóng gói, được xác định trong thời gian hệ thống hoạt động và được coi như là biến của kiểu dữ liệu lớp (class).
Đối tượng = Phương thức + Dữ liệu.
Đóng gói (bao gói): thông tin của đối tượng được che giấu để các đối tượng khác không thấy được gì về cấu trúc bên trong của nó. Các đối tượng chỉ có thể trao đổi với nhau thông qua các giao diện, thông qua các thông báo.
Kế thừa (sử dụng lại): các đối tượng của một lớp có thể sử dụng một số thuộc tính và phương thức của các đối tượng ở những lớp khác...
II. ÁP DỤNG CHO BÀI TOÁN QUẢN LÝ SINH VIÊN
• Các phương thức.
Sơ đồ kế thừa.

Code C++ (VC2019)
Cách 1: kế thừa.
// 43VangVanQuyn.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;
class SINHVIEN {
protected:
char maso[10], hotendem[30], ten[20], khoa[20];
double diemanh, diemtincs;
public:
void Nhap();
void Indulieu();
};
class NGANHTOAN :SINHVIEN {
private:
double diemgt, diemds;
public:
void Nhap();
void Indulieu();
double Dtb();
string Xeploai();
};
class NGANHTIN :SINHVIEN {
private:
double diemnnc, diemctdl;
public:
void Nhap();
void Indulieu();
double Dtb();
string Xeploai();
};
void SINHVIEN::Nhap() {
cout << "Ma so: "; cin.getline(this->maso, 10);
cout << "Ho ten dem: "; cin.getline(this->hotendem, 30);
cout << "Ten: "; cin.getline(this->ten, 20);
cout << "khoa: "; cin.getline(this->khoa, 20);
cout << "Diem tieng Anh: "; cin >> this->diemanh;
cout << "Diem tin co so: "; cin >> this->diemtincs;
}
void SINHVIEN::Indulieu() {
cout << setw(10) << left << maso
<< setw(25) << left << hotendem
<< setw(10) << left << ten
<< setw(15) << left << khoa
<< setw(10) << left << setprecision(2) << fixed << diemanh
<< setw(10) << left << setprecision(2) << fixed << diemtincs;
}
void NGANHTOAN::Nhap() {
this->SINHVIEN::Nhap();
cout << "Diem giai tich: "; cin >> this->diemgt;
cout << "Diem dai so: "; cin >> this->diemds;
}
void NGANHTOAN::Indulieu() {
this->SINHVIEN::Indulieu();
cout << setw(10) << left << setprecision(2) << fixed << diemgt
<< setw(10) << left << setprecision(2) << fixed << diemds
<< setw(10) << left << setprecision(2) << fixed << Dtb()
<< setw(20) << left << Xeploai();
}
double NGANHTOAN::Dtb() {
double dtb = 0;
dtb = this->diemanh + this->diemtincs;
dtb = dtb + this->diemgt + this->diemds;
dtb = dtb / 4;
return dtb;
}
string NGANHTOAN::Xeploai() {
string kq = "";
double dtb = this->Dtb();
if (dtb > 8.0) kq = "Gioi";
else if ((dtb >= 6.5) && (dtb < 8.0)) kq = "Kha";
else if ((dtb >= 5.0) && (dtb < 6.5)) kq = "Trung binh";
else kq = "Yeu";
return kq;
}
void NGANHTIN::Nhap() {
this->SINHVIEN::Nhap();
cout << "Diem NN C: "; cin >> this->diemnnc;
cout << "Diem CTDL: "; cin >> this->diemctdl;
}
void NGANHTIN::Indulieu() {
this->SINHVIEN::Indulieu();
cout << setw(10) << left << setprecision(2) << fixed << diemnnc
<< setw(10) << left << setprecision(2) << fixed << diemctdl
<< setw(10) << left << setprecision(2) << fixed << Dtb()
<< setw(20) << left << Xeploai();
}
double NGANHTIN::Dtb() {
double dtb = 0;
dtb = this->diemanh + this->diemtincs;
dtb = dtb + this->diemnnc + this->diemctdl;
dtb = dtb / 4;
return dtb;
}
string NGANHTIN::Xeploai() {
string kq = "";
double dtb = this->Dtb();
if (dtb > 8.0) kq = "Gioi";
else if ((dtb >= 6.5) && (dtb < 8.0)) kq = "Kha";
else if ((dtb >= 5.0) && (dtb < 6.5)) kq = "Trung binh";
else kq = "Yeu";
return kq;
}
// (phần DS_SVTOAN, DS_SVTIN, main giữ nguyên phía dưới như bạn đã gửi)