Kế thừa đa cấp và đa cấp trong C++

Trong hướng dẫn trước, chúng ta đã học về thừa kế trong C++. Tùy thuộc vào cách dẫn xuất của lớp hoặc lớp kế thừa bao nhiêu lớp cơ sở mà ta có các kiểu kế thừa sau

  • Thừa kế đơn
  • Đa thừa kế
  • Kế thừa đa cấp
  • Kế thừa phân cấp
  • Kế thừa lai

=> Xem tại đây để khám phá danh sách Hướng dẫn C++ đầy đủ

Kế thừa đa cấp và đa cấp trong C++

Bạn sẽ học được gì

Các loại thừa kế

Đưa ra dưới đây là một đại diện bằng hình ảnh của các loại thừa kế khác nhau

Kế thừa đa cấp và đa cấp trong C++

Chúng ta sẽ xem từng loại thừa kế với các ví dụ trong các phần bên dưới

#1) Thừa kế đơn

Trong kế thừa đơn, một lớp chỉ xuất phát từ một lớp cơ sở. Điều này có nghĩa là chỉ có một lớp con được dẫn xuất từ ​​một lớp cha

Thừa kế đơn thường được khai báo như sau

class subclassname : accessspecifier superclassname {
                    //class specific code;
 };

Kế thừa đa cấp và đa cấp trong C++

Đưa ra dưới đây là một ví dụ hoàn chỉnh về kế thừa đơn

#include 
#include 
using namespace std;
class Animal
{
   string name="";
   public:
   int tail=1;
   int legs=4;
 
};
class Dog : public Animal
{
   public:
   void voiceAction()
   {
      cout<<"Barks!!!";
   }
};
int main()
{
   Dog dog;
   cout<<"Dog has "<

đầu ra

Chó có 4 chân
Chó có 1 đuôi
Tiếng chó sủa

Chúng tôi có một lớp Động vật làm lớp cơ sở mà từ đó chúng tôi đã dẫn xuất một lớp con chó. Lớp dog kế thừa tất cả các thành viên của lớp Animal và có thể được mở rộng để bao gồm các thuộc tính riêng của nó, như được thấy từ đầu ra

Thừa kế đơn thân là hình thức thừa kế đơn giản nhất

#2) Đa thừa kế

Đa kế thừa được thể hiện bằng hình ảnh bên dưới

Kế thừa đa cấp và đa cấp trong C++

Đa kế thừa là kiểu kế thừa trong đó một lớp kế thừa từ nhiều lớp. Như thể hiện trong sơ đồ trên, lớp C là một lớp con có lớp A và lớp B là lớp cha của nó

Trong một tình huống thực tế, một đứa trẻ được thừa kế từ cha và mẹ của chúng. Đây có thể coi là một ví dụ về đa thừa kế

Chúng tôi trình bày chương trình dưới đây để chứng minh Đa kế thừa

#include 
using namespace std;
//multiple inheritance example
class student_marks {
protected:
int rollNo, marks1, marks2;
public:
void get() {
cout << "Enter the Roll No.: "; cin >> rollNo;
cout << "Enter the two highest marks: "; cin >> marks1 >> marks2;
   }
};
class cocurricular_marks {
protected:
int comarks;
public:
void getsm() {
cout << "Enter the mark for CoCurricular Activities: "; cin >> comarks;
   }
};

//Result is a combination of subject_marks and cocurricular activities marks
class Result : public student_marks, public cocurricular_marks {
   int total_marks, avg_marks;
   public:
   void display()
   {
      total_marks = (marks1 + marks2 + comarks);
      avg_marks = total_marks / 3;
      cout << "\nRoll No: " << rollNo << "\nTotal marks: " << total_marks;
      cout << "\nAverage marks: " << avg_marks;
   }
};
int main()
{
   Result res;
res.get(); //read subject marks
res.getsm(); //read cocurricular activities marks
res.display(); //display the total marks and average marks
}

đầu ra

Nhập cuộn Không. 25
Nhập hai điểm cao nhất. 40 50
Nhập điểm cho Hoạt động ngoại khóa. 30

cuộn Không. 25
Tổng số điểm. 120
Điểm trung bình. 40

Trong ví dụ trên, chúng ta có ba lớp i. e. Điểm_sinh_viên,_điểm_trường_học và Kết quả. Lớp student_marks đọc điểm môn cho học sinh. class colingual_marks đọc điểm của học sinh trong các hoạt động ngoại khóa

Lớp Kết quả tính tổng_điểm cho học sinh cùng với điểm trung bình

Trong mô hình này, lớp Kết quả được lấy từ student_marks và colingual_marks khi chúng ta tính toán kết quả từ điểm môn học cũng như hoạt động ngoại khóa

Điều này thể hiện nhiều kế thừa

Vấn đề kim cương

Vấn đề kim cương được thể hiện bằng hình ảnh dưới đây

Kế thừa đa cấp và đa cấp trong C++

Ở đây, chúng ta có một lớp con kế thừa hai lớp Cha và Mẹ. Hai lớp này lần lượt kế thừa lớp Person

Như thể hiện trong hình, một lớp Con kế thừa các đặc điểm của lớp Người hai lần i. e. một lần từ Cha và lần thứ hai từ Mẹ. Điều này dẫn đến sự mơ hồ vì trình biên dịch không hiểu nên đi theo hướng nào

Vì kịch bản này phát sinh khi chúng ta có tài sản thừa kế hình kim cương nên vấn đề này được gọi là “Vấn đề kim cương”

Sự cố Kim cương được triển khai trong C++ dẫn đến lỗi không rõ ràng khi biên dịch. Chúng ta có thể giải quyết vấn đề này bằng cách biến lớp cơ sở gốc thành ảo. Chúng ta sẽ tìm hiểu thêm về từ khóa “ảo” trong hướng dẫn sắp tới của chúng tôi về tính đa hình

#3) Kế thừa đa cấp

Kế thừa đa cấp được trình bày bên dưới

Kế thừa đa cấp và đa cấp trong C++

Trong kế thừa đa cấp, một lớp được dẫn xuất từ ​​một lớp dẫn xuất khác. Sự kế thừa này có thể có nhiều cấp độ miễn là việc triển khai của chúng tôi không đi chệch hướng. Trong sơ đồ trên, lớp C có nguồn gốc từ lớp B. Lớp B lại được dẫn xuất từ ​​lớp A

Chúng ta hãy xem một ví dụ về Kế thừa đa cấp

#include 
#include 
using namespace std;
class Animal
{
   string name="";
   public:
   int tail=1;
   int legs=4;
 
};
class Dog : public Animal
{
   public:
   void voiceAction()
   {
      cout<<"Barks!!!";
   }
};
class Puppy:public Dog{
   public:
   void weeping()
   {
      cout<<"Weeps!!";
   }
};
int main()
{
   Puppy puppy;
cout<<"Puppy has "<

đầu ra

Chú cún có 4 chân
Chó con có 1 đuôi
con chó sủa. con chó con khóc

Ở đây, chúng tôi đã sửa đổi ví dụ về Kế thừa đơn sao cho có một lớp mới Puppy kế thừa từ lớp Dog, lớp này kế thừa từ lớp Animal. Chúng ta thấy rằng lớp Puppy có được và sử dụng các thuộc tính và phương thức của cả hai lớp trên nó

#4) Thừa kế lai

Kế thừa lai được mô tả dưới đây

Kế thừa đa cấp và đa cấp trong C++

Thừa kế lai thường là sự kết hợp của nhiều kiểu thừa kế. Trong biểu diễn trên, chúng ta có đa thừa kế (B, C và D) và đa thừa kế (A, B và D) để có được thừa kế lai

Chúng ta hãy xem một ví dụ về Kế thừa lai

#include 
#include 
using namespace std;
//Hybrid inheritance = multilevel + multilpe
class student{ //First base Class
                int id;
                string name;
                public:
                void getstudent(){
                                cout << "Enter student Id and student name"; cin >> id >> name;
   }
};
class marks: public student{ //derived from student
                protected:
                int marks_math,marks_phy,marks_chem;
                public:
                void getmarks(){
                               cout << "Enter 3 subject marks:"; cin >>marks_math>>marks_phy>>marks_chem;
   }
};
class sports{
              protected:
              int spmarks;
              public:
              void getsports(){
                              cout << "Enter sports marks:"; cin >> spmarks;
   }
};
class result : public marks, public sports{//Derived class by multiple inheritance//
                int total_marks;
                float avg_marks;
                public :
               void display(){
                             total_marks=marks_math+marks_phy+marks_chem;
                             avg_marks=total_marks/3.0;

                           cout << "Total marks =" << total_marks << endl;
                           cout << "Average marks =" << avg_marks << endl;
                           cout << "Average + Sports marks =" << avg_marks+spmarks;
   }
};
 
 
int main(){
                result res;//object//
                res.getstudent();
                res.getmarks();
                res.getsports();
                res.display();
               return 0;
}

đầu ra

Nhập ID sinh viên và tên sinh viên 25 Ved
Nhập 3 điểm môn học. 89 88 87
Nhập điểm thể thao. 40
Tổng số điểm =264
Điểm trung bình =88
Trung bình + Điểm thể thao =128

Ở đây chúng tôi có bốn lớp tôi. e. Học sinh, Điểm số, Thể thao và Kết quả. Điểm được lấy từ lớp sinh viên. Kết quả lớp bắt nguồn từ Điểm và Thể thao khi chúng tôi tính toán kết quả từ điểm môn học cũng như điểm thể thao

Đầu ra được tạo bằng cách tạo một đối tượng của lớp Kết quả đã có được các thuộc tính của cả ba lớp

Lưu ý rằng trong kế thừa kết hợp cũng vậy, việc triển khai có thể dẫn đến "Sự cố kim cương" có thể được giải quyết bằng cách sử dụng từ khóa "ảo" như đã đề cập trước đây

#5) Kế thừa thứ bậc

Kế thừa đa cấp và đa cấp trong C++

Trong kế thừa phân cấp, nhiều hơn một lớp kế thừa từ một lớp cơ sở duy nhất như thể hiện trong biểu diễn ở trên. Điều này mang lại cho nó một cấu trúc của một hệ thống phân cấp

Đưa ra dưới đây là Ví dụ minh họa Kế thừa phân cấp

#include 
using namespace std;
//hierarchical inheritance example
class Shape                   // shape class -> base class
{
public:
int x,y;
 
void get_data(int n,int m) {
      x= n;
      y = m;
   }
};
class Rectangle : public Shape // inherit Shape class
{
public: 
int area_rect() {
int area = x*y;
return area;
   }
};
class Triangle : public Shape // inherit Shape class
{
public:
int triangle_area() {
float area = 0.5*x*y;
return area;
   }
};
class Square : public Shape // inherit Shape class
{
public:
int square_area() {
float area = 4*x;
return area;
   }
};
int main()
{ Rectangle r;
   Triangle t;
   Square s;
   int length,breadth,base,height,side;
   //area of a Rectangle
   std::cout << "Enter the length and breadth of a rectangle: "; cin>>length>>breadth;
   r.get_data(length,breadth);
   int rect_area = r.area_rect();
   std::cout << "Area of the rectangle = " <>base>>height;
   t.get_data(base,height);
   float tri_area = t.triangle_area();
   std::cout <<"Area of the triangle = " << tri_area<>side;
   s.get_data(side,side);
   int sq_area = s.square_area();
   std::cout <<"Area of the square = " << sq_area<

đầu ra

Nhập chiều dài và chiều rộng của hình chữ nhật. 10 5
Diện tích hình chữ nhật = 50
Nhập đáy và chiều cao của tam giác. 4 8
Diện tích tam giác = 16
Nhập độ dài một cạnh của hình vuông. 5
Diện tích hình vuông = 20

Ví dụ trên là một ví dụ kinh điển của lớp Shape. Chúng ta có một lớp cơ sở Shape và ba lớp i. e. hình chữ nhật, hình tam giác và hình vuông được bắt nguồn từ nó

Chúng ta có một phương thức để đọc dữ liệu trong lớp Shape trong khi mỗi lớp dẫn xuất có một phương thức riêng để tính diện tích. Trong hàm main, chúng ta đọc dữ liệu cho từng đối tượng rồi tính diện tích

Phần kết luận

Khi so sánh với các ngôn ngữ lập trình khác, ngôn ngữ C++ hỗ trợ tất cả các kiểu kế thừa. Thực tế có thể nói C++ hỗ trợ rất tốt cho tính kế thừa. Chúng ta có thể mô hình hóa các vấn đề thời gian thực hiệu quả hơn bằng C++

Sự khác biệt giữa kế thừa đa cấp và đa cấp trong C là gì?

Sự khác biệt giữa kế thừa Đa cấp và Đa cấp là ở chỗ Đa kế thừa là khi một lớp kế thừa từ nhiều lớp cơ sở trong khi Kế thừa đa cấp là khi một lớp kế thừa từ một lớp dẫn xuất, making that derived class a base class for a new class.

Kế thừa đa cấp trong C là gì?

Lưu bài viết. Kế thừa đa cấp trong C++ là quá trình dẫn xuất một lớp từ một lớp dẫn xuất khác . Khi một lớp kế thừa một lớp khác, nó sẽ được kế thừa bởi một lớp khác. Nó được gọi là kế thừa đa cấp.

C có hỗ trợ kế thừa đa cấp không?

Như thể hiện trong sơ đồ bên dưới, lớp C kế thừa các tính năng của lớp A và B. Nhưng C# không hỗ trợ kế thừa nhiều lớp. Để khắc phục vấn đề này, chúng tôi sử dụng các giao diện để đạt được sự kế thừa nhiều lớp

Sự khác biệt giữa kế thừa đơn và đa cấp là gì?

Trong trường hợp kế thừa đơn lẻ, lớp dẫn xuất thực hiện kế thừa của một lớp cơ sở duy nhất. Trong trường hợp đa kế thừa, lớp dẫn xuất có thể nhận nhiều lớp cơ sở . Các lớp dẫn xuất có thể sử dụng các tính năng thuộc về một lớp cơ sở duy nhất.