Chi tiết bài học Kế thừa trong C++

Kế thừa trong C++

Trong bài này, bạn sẽ học toàn bộ mọi thứ về thừa kế ( Inheritance ) trong C + +. Cụ thể hơn, bạn sẽ được học thừa kế là gì, những 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 thừa kế sẽ thừa kế hàng loạt tính năng của lớp chính và hoàn toàn có thể có những tính năng bổ trợ 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 hoàn toàn có thể tạo riêng ba lớp dành cho việc đi bộ, trò truyện và thực thi những kiến thức và kỹ năng đặc biệt quan trọng như bộc lộ trong hình sau .

Trong mỗi lớp, bạn hoàn toàn có thể sao chép cùng đoạn mã cho việc đi bộ và trò truyện so 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ựa như cho từng nhân vật. Điều này hoàn toàn có thể thuận tiện 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à những lớp GiáoViênToán và CầuThủ là những lớp thừa kế từ ConNgười .
Lớp thừa kế 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ó thừa kế .
Vì, GiáoViênToán và CầuThủ đều kế thừa từ ConNgười, mọi tài liệu thành viên và hàm thành viên của lớp ConNgười hoàn toàn có thể được truy xuất từ chúng .

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

Tạo những đối tượng người tiêu dùng trong game show sử dụng định nghĩa về thừa kế

#include 
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 thừa kế từ Person .
Lớp Person có hai tài liệu thành viên – profession và age. Nó cũng gồm có hai hàm thành viên là walk ( ) và talk ( ) .
Cả MathsTeacher và Footballer đều hoàn toàn có thể truy xuất vào hàng loạt tài liệu thành viên và hàm thành viên của Person .
Tuy nhiên, MathsTeacher và Footballer đều có những hàm thành viên của chính nó : teachMaths ( ) và playFootball ( ). Các hàm này chỉ được truy xuất bởi những lớp của nó .
Trong hàm main ( ), một đối tượng người tiêu dùng MathsTeacher mới là teacher được tạo .
Vì nó hoàn toàn có thể truy vấn vào tài liệu thành viên của Person nên giá trị profession và age 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 người dùng Footballer mới là footballer cũng được tạo ra. Nó hoàn toàn có thể truy xuất vào tài 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 hoàn toàn có thể sử dụng những chỉ định truy xuất khác nhau cho những tài liệu thành viên của lớp chính .
Sẽ có những chỉ định như public, protected và private .
Trong ví dụ trên, lớp chính Person được thừa kế một cách public ( công khai minh bạch ) bởi MathsTeacher và Footballer .

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 người tiêu dùng của lớp thừa kế và thử truy xuất vào hàm thành viên đó, chỉ có hàm thành viên trong lớp thừa kế là được gọi .
Hàm thành viên của lớp thừa kế sẽ ghi đè hàm thành viên của lớp chính .