← Danh sách bài học
🏛️

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.