Kế thừa C++

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về kế thừa trong C ++ với sự trợ giúp của các 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 chúng ta tạo một lớp mới (lớp dẫn xuất) từ một lớp hiện có (lớp cơ sở).

Lớp dẫn xuất kế thừa các tính năng từ lớp cơ sở và có thể có các tính năng bổ sung của riêng nó. Ví dụ,

class Animal {
    // eat() function
    // sleep() function
};

class Dog : public Animal {
    // bark() function
};

Ở đây, Doglớp được dẫn xuất từ Animallớp. Vì Dogcó nguồn gốc từ Animal, các thành viên của Animalcó thể truy cập được Dog.Kế thừa trong C ++

Lưu ý việc sử dụng từ khóa publickhi kế thừa Dog từ Animal.

class Dog : public Animal {...};

Chúng tôi cũng có thể sử dụng các từ khóa privatevà protectedthay vì public. Chúng tôi sẽ tìm hiểu về sự khác biệt giữa việc sử dụng privatepublicvà protectedsau này trong hướng dẫn này.

là một mối quan hệ

Thừa kế là một mối quan hệ . Chúng tôi sử dụng kế thừa chỉ khi có một mối quan hệ is -a giữa hai lớp.

Dưới đây là một số ví dụ:

  • A car is a vehicle.
  • Orange is a fruit.
  • A surgeon is a doctor.
  • A dog is an animal.

Ví dụ 1: Ví dụ đơn giản về kế thừa C ++

// C++ program to demonstrate inheritance

#include <iostream>
using namespace std;

// base class
class Animal {

   public:
    void eat() {
        cout << "I can eat!" << endl;
    }

    void sleep() {
        cout << "I can sleep!" << endl;
    }
};

// derived class
class Dog : public Animal {
 
   public:
    void bark() {
        cout << "I can bark! Woof woof!!" << endl;
    }
};

int main() {
    // Create object of the Dog class
    Dog dog1;

    // Calling members of the base class
    dog1.eat();
    dog1.sleep();

    // Calling member of the derived class
    dog1.bark();

    return 0;
}

Đầu ra

I can eat!
I can sleep!
I can bark! Woof woof!!

Ở đây, dog1 (đối tượng của lớp dẫn xuất Dog) có thể truy cập các thành viên của lớp cơ sở Animal. Đó là bởi vì Dognó được thừa hưởng từ Animal.

// Calling members of the Animal class
dog1.eat();
dog1.sleep();

Thành viên được bảo vệ bằng C ++

Công cụ sửa đổi truy cập protectedđặc biệt có liên quan khi nói đến kế thừa C ++.

Giống như privatecác thành viên, protectedcác thành viên không thể truy cập được bên ngoài lớp học. Tuy nhiên, chúng có thể được truy cập bởi các lớp dẫn xuất và các lớp / hàm bạn bè .

Chúng ta cần protectedcác thành viên nếu chúng ta muốn ẩn dữ liệu của một lớp, nhưng vẫn muốn dữ liệu đó được kế thừa bởi các lớp dẫn xuất của nó.

Để tìm hiểu thêm về được bảo vệ, hãy tham khảo hướng dẫn Công cụ sửa đổi quyền truy cập C ++ của chúng tôi .

Ví dụ 2: Các thành viên được bảo vệ trong C++

// C++ program to demonstrate protected members

#include <iostream>
#include <string>
using namespace std;

// base class
class Animal {

   private:
    string color;

   protected:
    string type;

   public:
    void eat() {
        cout << "I can eat!" << endl;
    }

    void sleep() {
        cout << "I can sleep!" << endl;
    }

    void setColor(string clr) {
        color = clr;
    }

    string getColor() {
        return color;
    }
};

// derived class
class Dog : public Animal {

   public:
    void setType(string tp) {
        type = tp;
    }

    void displayInfo(string c) {
        cout << "I am a " << type << endl;
        cout << "My color is " << c << endl;
    }

    void bark() {
        cout << "I can bark! Woof woof!!" << endl;
    }
};

int main() {
    // Create object of the Dog class
    Dog dog1;

    // Calling members of the base class
    dog1.eat();
    dog1.sleep();
    dog1.setColor("black");

    // Calling member of the derived class
    dog1.bark();
    dog1.setType("mammal");

    // Using getColor() of dog1 as argument
    // getColor() returns string data
    dog1.displayInfo(dog1.getColor());

    return 0;
}

Đầu ra

I can eat!
I can sleep!
I can bark! Woof woof!!
I am a mammal
My color is black

Ở đây, kiểu biến là protectedvà do đó có thể truy cập được từ lớp dẫn xuất Dog. Chúng ta có thể thấy điều này khi chúng ta đã khởi tạo typetrong Doglớp bằng hàm setType().

Mặt khác, màuprivate biến không thể được khởi tạo trong .Dog

class Dog : public Animal {

    public:
      void setColor(string clr) {
          // Error: member "Animal::color" is inaccessible
          color = clr; 
      }
};

Ngoài ra, vì protectedtừ khóa ẩn dữ liệu, chúng tôi không thể truy cập loại trực tiếp từ một đối tượng của Doghoặc Animallớp.

// Error: member "Animal::type" is inaccessible
dog1.type = "mammal";

Chế độ truy cập trong kế thừa C++

Trong các hướng dẫn trước đây của chúng tôi, chúng tôi đã tìm hiểu về các chỉ định truy cập C ++ chẳng hạn như công khai, riêng tư và bảo vệ .

Cho đến nay, chúng tôi đã sử dụng publictừ khóa để kế thừa một lớp từ một lớp cơ sở đã tồn tại trước đó. Tuy nhiên, chúng ta cũng có thể sử dụng privatevà protectedtừ khóa để kế thừa các lớp. Ví dụ,

class Animal {
    // code
};

class Dog : private Animal {
    // code
};
class Cat : protected Animal {
    // code
};

Các cách khác nhau mà chúng ta có thể lấy ra các lớp được gọi là các chế độ truy cập . Các chế độ truy cập này có tác dụng sau:

  1. public: Nếu một lớp dẫn xuất được khai báo trong publicchế độ, thì các thành viên của lớp cơ sở được kế thừa bởi lớp dẫn xuất giống như chúng.
  2. private: Trong trường hợp này, tất cả các thành viên của lớp cơ sở trở privatethành thành viên trong lớp dẫn xuất.
  3. được bảo vệ: Các publicthành viên của lớp cơ sở trở protectedthành thành viên trong lớp dẫn xuất.

Các privatethành viên của lớp cơ sở luôn privatenằm trong lớp dẫn xuất.

Để tìm hiểu thêm, hãy truy cập hướng dẫn kế thừa C ++ công khai, riêng tư, được bảo vệ của chúng tôi .

Ghi đè chức năng thành viên trong kế thừa

Giả sử, lớp cơ sở và lớp dẫn xuất có các hàm thành viên có cùng tên và các đối số.

Nếu chúng ta tạo một đối tượng của lớp dẫn xuất và cố gắng truy cập hàm thành viên đó, thì hàm thành viên trong lớp dẫn xuất được gọi thay vì hàm trong lớp cơ sở.

Hàm thành viên của lớp dẫn xuất ghi đè hàm thành viên của lớp cơ sở.

Tìm hiểu thêm về ghi đè hàm trong C ++ .

Bài học tiếp theo Đề xuất đọc: Đa kế thừa C ++









Gõ tìm kiếm nhanh...