OOP
Lập trình hướng đối tượng (OOP) gói dữ liệu + hành vi vào class. 4 nguyên tắc: đóng gói, kế thừa, đa hình, trừu tượng.
1. Class và Object
class định nghĩa khuôn, object là thể hiện. Access modifier: private (mặc định), protected, public.
class SinhVien {
private:
string ten;
double gpa;
public:
SinhVien(string t, double g) : ten(t), gpa(g) {}
void in() const { cout << ten << " - " << gpa; }
};2. Constructor / Destructor
Constructor tạo object, có thể overload. Destructor ~ClassName() dọn dẹp tài nguyên. Rule of Three/Five nếu có tài nguyên thô.
3. Kế thừa (inheritance)
class Con : public Cha {}; Con thừa hưởng public/protected của Cha. Gọi constructor cha qua initializer list.
4. Đa hình (polymorphism)
Method virtual ở lớp cha, override ở lớp con. Gọi qua con trỏ/tham chiếu lớp cha sẽ chọn đúng method con tại runtime. Nếu có virtual method thì destructor cũng nên virtual.
5. Abstract class
Class có ít nhất 1 pure virtual: virtual void f() = 0; Không tạo được object, chỉ để kế thừa.
💻 Code mẫu thực chiến
Hệ thống hình học
Class Shape trừu tượng, Circle & Square kế thừa, tính diện tích.
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Shape {
public:
virtual double area() const = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
double r;
public:
Circle(double r) : r(r) {}
double area() const override { return 3.14159 * r * r; }
};
class Square : public Shape {
double s;
public:
Square(double s) : s(s) {}
double area() const override { return s * s; }
};
int main() {
vector<unique_ptr<Shape>> shapes;
shapes.push_back(make_unique<Circle>(3));
shapes.push_back(make_unique<Square>(4));
for (auto& s : shapes) cout << s->area() << " ";
}Tài khoản ngân hàng
Đóng gói số dư, chỉ cho phép rút/nạp qua method.
class TaiKhoan {
double soDu = 0;
public:
void nap(double x) { if (x > 0) soDu += x; }
bool rut(double x) {
if (x <= 0 || x > soDu) return false;
soDu -= x;
return true;
}
double getSoDu() const { return soDu; }
};💡 Mẹo & lưu ý
- Đánh dấu method không thay đổi state là const.
- Prefer composition over inheritance khi mối quan hệ không phải 'is-a'.
- Destructor của lớp cha phải virtual nếu có đa hình.