Computer >> Máy Tính >  >> Lập trình >> C ++

Điều gì sẽ xảy ra khi một hàm ảo được gọi bên trong một hàm không phải ảo trong C ++


Trong phần này, chúng ta sẽ thảo luận về những thông tin thú vị về các lớp ảo trong C ++. Trước tiên, chúng ta sẽ xem xét hai trường hợp, sau đó chúng ta sẽ phân tích thực tế.

  • Lúc đầu, thực thi chương trình mà không sử dụng bất kỳ chức năng ảo nào.

  • Thực thi chương trình bằng cách sử dụng bất kỳ chức năng ảo nào trong chức năng không phải ảo.

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <iostream>
using namespace std;
class BaseClass {
public:
   void display(){
      cout << "Print function from the base class" << endl;
   }
   void call_disp(){
      cout << "Calling display() from derived" << endl;
      this -> display();
   }
};
class DerivedClass: public BaseClass {
public:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
   void call_disp() {
      cout << "Calling display() from derived" << endl ;
      this -> display();
   }
};
int main() {
   BaseClass *bp = new DerivedClass;
   bp->call_disp();
}

Đầu ra

Calling display() from base class
Print function from the base class

Từ đầu ra, chúng ta có thể hiểu hành vi đa hình hoạt động ngay cả khi một hàm ảo được gọi bên trong một hàm không ảo. Hàm nào sẽ được gọi sẽ được quyết định trong thời gian chạy áp dụng vptr và vtable.

  • vtable - Đây là một bảng các con trỏ hàm, được duy trì cho mỗi lớp.

  • vptr - Đây là một con trỏ tới vtable, được duy trì cho mỗi cá thể đối tượng.