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

Một hàm ảo C ++ có thể có các tham số mặc định không?

Có, các hàm ảo C ++ có thể có các tham số mặc định.

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 ta quan sát 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.