Kế thừa trong C++

Trong bài này, bạn sẽ học tất cả mọi thứ về kế thừa (Inheritance) trong C++. Cụ thể hơn, bạn sẽ được học kế thừa là gì, các cách khác nhau để lập trình nó kèm theo ví dụ.

Kế thừa là một trong những tính năng chính của lập trình hướng đối tượng trong C++. Nó cho phép người dùng tạo một lớp (lớp kế thừa) từ một lớp có sẵn (lớp chính).

Lớp kế thừa sẽ kế thừa toàn bộ tính năng của lớp chính và có thể có các tính năng bổ sung của riêng nó.

Tại sao kế thừa nên được sử dụng

Giả sử, trong trò chơi của mình, bạn muốn tạo 3 nhân vật - một giáo viên toán, một cầu thủmột doanh nhân.

Vì toàn bộ những nhân vật trên đều là con người, họ có thể đi bộ và trò chuyện. Tuy nhiên, họ lại có những kỹ năng đặc biệt. Một giáo viên toán có thể dạy toán, một cầu thử có thể chơi bóng, và một doanh nhân có thể điều hành một doanh nghiệp.

Bạn có thể tạo riêng ba lớp dành cho việc đi bộ, trò truyện và thực hiện các kỹ năng đặc biệt như thể hiện trong hình sau.

Trong mỗi lớp, bạn có thể sao chép cùng đoạn mã cho việc đi bộ và trò truyện đối với mỗi nhân vật.

Nếu bạn muốn thêm một tính năng mới - ăn, bạn cần lập trình một đoạn mã tương tự cho từng nhân vật. Điều này có thể dễ dàng gây lỗi (khi sao chép) và gây trùng lặp mã nguồn.

Nó sẽ được thực hiện dễ dàng hơn nếu chúng ta có một lớp Con Người và các tính năng cơ bản như trò truyện, đi bộ, ăn, ngủ và bổ sung thêm các tính năng đặc biệt cho mỗi nhân vật. Điều này có thể được thực hiện thông qua kế thừa.

Sử dụng kế thừa, giờ đây bạn không cần phải lập trình cùng đoạn mã nguồn cho việc đi bộ và trò truyện đối với mỗi lớp. Bạn chỉ cần kế thừa chúng.

Vì thế, đối với giáo viên Toán (lớp kế thừa), bạn cần kế thừa toàn bộ tính năng của một Con Người (lớp chính) và bổ sung một tính năng mới đó là dạyToán. Tương tự, với một cầu thủ, bạn cần kế thừa toàn bộ tính năng của một người và thêm vào một tính năng cho phép người đó chơi bóng…

Cần ghi nhớ: Khi làm việc với kế thừa, mỗi lớp kế thừa cần thỏa mãn điều kiện rằng nó có “là một” lớp chính hay không. Trong ví dụ trên, giáo viên toán là một Con Người. Cầu thủ là một con người. Bạn không thể có: doanh nhân là một doanh nhân.

Lập trình kế thừa trong C++

class ConNgười 
{
  ... .. ...
};

class GiáoViênToán : public ConNgười 
{
  ... .. ...
};

class CầuThủ : public ConNgười
{
  .... .. ...
};

Trong ví dụ trên, lớp ConNgười là lớp chính và các lớp GiáoViênToánCầuThủ là các lớp kế thừa từ ConNgười.

Lớp kế thừa thường chứa khai báo của một lớp theo sau bởi dấu chấm phẩy, từ khóa public và tên của lớp chính mà nó kế thừa.

Vì, GiáoViênToánCầuThủ đều kế thừa từ ConNgười, mọi dữ liệu thành viên và hàm thành viên của lớp ConNgười có thể được truy xuất từ chúng.

Ví dụ: Kế thừa trong lập trình C++

Tạo các đối tượng trong trò chơi sử dụng định nghĩa về kế thừa

#include <iostream>
using namespace std;

class Person
{
     public:
        string profession;
        int age;

        Person(): profession("unemployed"), age(16) { }
        void display()
        {
             cout << "My profession is: " << profession << endl;
             cout << "My age is: " << age << endl;
             walk();
             talk();
        }
        void walk() { cout << "I can walk." << endl; }
        void talk() { cout << "I can talk." << endl; }
};

// Lớp MathsTeacher được kế thừa từ lớp Person
class MathsTeacher : public Person
{
    public:
       void teachMaths() { cout << "I can teach Maths." << endl; }
};

// Lớp cầu thử được kế thừa từ lớp Person
class Footballer : public Person
{
    public:
       void playFootball() { cout << "I can play Football." << endl; }
};

int main()
{
     MathsTeacher teacher;
     teacher.profession = "Teacher";
     teacher.age = 23;
     teacher.display();
     teacher.teachMaths();

     Footballer footballer;
     footballer.profession = "Footballer";
     footballer.age = 19;
     footballer.display();
     footballer.playFootball();

     return 0;
}

Đầu ra

My profession is: Teacher

My age is: 23

I can walk.

I can talk.

I can teach Maths.

My profession is: Footballer

My age is: 19

I can walk.

I can talk.

I can play Football.

Trong chương trình trên, Person (Con Người) là lớp chính, trong khi MathsTeacher (Giáo Viên Toán)và Footballer (Cầu Thủ) được kế thừa từ Person.

Lớp Person có hai dữ liệu thành viên - professionage. Nó cũng bao gồm hai hàm thành viên là walk()talk().

Cả MathsTeacherFootballer đều có thể truy xuất vào toàn bộ dữ liệu thành viên và hàm thành viên của Person.

Tuy nhiên, MathsTeacherFootballer đều có các hàm thành viên của chính nó: teachMaths()playFootball(). Các hàm này chỉ được truy xuất bởi các lớp của nó.

Trong hàm main(), một đối tượng MathsTeacher mới là teacher được tạo.

Vì nó có thể truy cập vào dữ liệu thành viên của Person nên giá trị professionage của teacher được gán giá trị. Dữ liệu này được hiển thị sử dụng hàm display() được định nghĩa trong lớp Person. Ngoài ra hàm teachMaths() được gọi và được định nghĩa trong lớp MathsTeacher.

Tương tự, một đối tượng Footballer mới là footballer cũng được tạo ra. Nó có thể truy xuất vào dữ liệu thành viên của Person mà sau đó sẽ được hiển thị bằng cách gọi hàm display(). Hàm playFootball() chỉ được truy xuất bởi footballer sẽ được gọi sau đó.

Chỉ định truy xuất (access specifiers) trong kế thừa

Khi tạo một lớp kế thừa từ một lớp chính, bạn có thể sử dụng các chỉ định truy xuất khác nhau cho các dữ liệu thành viên của lớp chính.

Sẽ có các chỉ định như public, protected và private.

Trong ví dụ trên, lớp chính Person được kế thừa một cách public (công khai) bởi MathsTeacherFootballer.

Tìm hiểu thêm về Kế thừa với Public, Protected và Private trong C++.

Ghi đè hàm thành viên trong kế thừa

Giả sử, lớp chính và lớp thành viên đều có hàm thành viên với tên và số lượng đối số giống nhau.

Nếu bạn muốn tạo một đối tượng của lớp kế thừa và thử truy xuất vào hàm thành viên đó, chỉ có hàm thành viên trong lớp kế thừa là được gọi.

Hàm thành viên của lớp kế thừa sẽ ghi đè hàm thành viên của lớp chính.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải