Chuyển đến nội dung chính
Mô-đun 6 · Bài học 1 trong tổng số 213/18 trong khóa học~12 min
Bài học theo mô-đun (1/2)

Kế thừa trong C++

Kế thừa là một trong những trụ cột chính của Lập trình hướng đối tượng (OOP). Nó cho phép một lớp mới (được gọi là lớp dẫn xuất hoặc lớp con) kế thừa các thành viên (thuộc tính và phương thức) từ một lớp hiện có (được gọi là lớp cơ sở hoặc lớp cha), thúc đẩy việc tái sử dụng mã.

Cú pháp cơ bản

Trong C++, tính kế thừa được chỉ định bằng toán tử : sau tên lớp dẫn xuất, theo sau là bộ xác định truy cập (thường là public) và tên lớp cơ sở.

C++
class Shape {
public:
    void setColor(std::string c) {
        color = c;
    }
protected:
    std::string color; // Accessible by derived classes
};

// Rectangle inherits publicly from Shape
class Rectangle : public Shape {
public:
    double getArea() {
        return width * height;
    }
private:
    double width {0.0};
    double height {0.0};
};

Công cụ xác định quyền truy cập: protected

Cùng với public và private, phần kế thừa giới thiệu công cụ xác định protected:

  • private thành viên của lớp cơ sở không có thể truy cập trực tiếp từ lớp dẫn xuất.
  • protected các thành viên của lớp cơ sở không thể truy cập được từ bên ngoài, nhưng có thể truy cập trực tiếp bên trong các lớp dẫn xuất.

Khởi tạo lớp cơ sở

Các nhà xây dựng không được kế thừa tự động. Khi khởi tạo một lớp dẫn xuất, hàm tạo của lớp cơ sở sẽ được gọi đầu tiên. Nếu lớp cơ sở yêu cầu đối số, chúng ta phải gọi nó một cách rõ ràng trong danh sách khởi tạo thành viên của hàm tạo dẫn xuất.

C++
class Parent {
public:
    Parent(int x) {
        std::cout << "Parent: " << x << std::endl;
    }
};

class Child : public Parent {
public:
    // Explicit call to Parent constructor
    Child(int x, int y) : Parent(x) {
        std::cout << "Child: " << y << std::endl;
    }
};

Hãy tự mình thử

tập thể dục#cpp.m6.l1.e1
Nỗ lực: 0Đang tải…

Tạo một lớp Dog kế thừa công khai từ lớp Animal. Lớp Dog phải bao gồm một phương thức public play() in ra 'Playing' bằng cách sử dụng std::cout.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng cú pháp `:` theo sau là `public Animal` để mở rộng lớp cơ sở, sau đó viết phương thức `play()`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#cpp.m6.l1.e2
Nỗ lực: 0Đang tải…

Hoàn thành lớp Xe bằng cách kế thừa từ Xe. Viết một hàm tạo cho Car chấp nhận std::string b và chuyển nó đến hàm tạo Vehicle thông qua danh sách trình khởi tạo thành viên.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Trong hàm tạo `Car`, hãy sử dụng cú pháp `: Vehicle(b)` ngay sau dấu ngoặc đơn tham số để ủy quyền khởi tạo thương hiệu cho lớp cơ sở.

Giải pháp khả dụng sau 3 lần thử