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

Đối số mặc định và hàm ảo trong C ++

Hãy xem xét một chương trình mẫu bằng C ++ để dễ hiểu khái niệm -

Mã mẫu

#include<iostream>
using namespace std;
class B {
   public:
      virtual void s(int a = 0) {
         cout<<" In Base \n";
      }
};
class D: public B {
   public:
      virtual void s(int a) {
         cout<<"In Derived, a="<<a;
      }
};
int main(void) {
   D d; // An object of class D
   B *b= &d;// A pointer of type B* pointing to d
   b->s();// prints"D::s() called"
   return 0;
}

Đầu ra

In Derived, a = 0

Trong đầu ra này, chúng tôi nhận thấy rằng, s () của lớp dẫn xuất được gọi và giá trị mặc định của lớp cơ sở s () được sử dụng.

Các đối số mặc định không tham gia vào chữ ký của các hàm. Vì vậy, chữ ký của s () trong lớp cơ sở và lớp dẫn xuất được coi là giống nhau, do đó s () của lớp cơ sở bị ghi đè. Giá trị mặc định được sử dụng tại thời điểm biên dịch. Khi trình biên dịch kiểm tra rằng một đối số bị thiếu trong một lệnh gọi hàm, nó sẽ thay thế giá trị mặc định đã cho. Do đó, trong chương trình trên, giá trị của x được thay thế tại thời điểm biên dịch và tại thời điểm chạy, s () của lớp dẫn xuất được gọi. Giá trị của a được thay thế tại thời điểm biên dịch và tại thời điểm chạy, s () của lớp dẫn xuất được gọi.