Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

อาร์กิวเมนต์เริ่มต้นและฟังก์ชันเสมือนใน C++


ลองพิจารณาโปรแกรมตัวอย่างในภาษา C++ เพื่อให้เข้าใจง่ายภายใต้แนวคิด -

โค้ดตัวอย่าง

#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;
}

ผลลัพธ์

In Derived, a = 0

ในผลลัพธ์นี้ เราสังเกตว่า s() ของคลาสที่ได้รับถูกเรียกใช้ และใช้ค่าเริ่มต้นของคลาสพื้นฐาน s()

อาร์กิวเมนต์เริ่มต้นไม่มีส่วนร่วมในลายเซ็นของฟังก์ชัน ดังนั้นลายเซ็นของ s() ในคลาสฐานและคลาสที่ได้รับจึงถือว่าเหมือนกัน ดังนั้น s() ของคลาสฐานจึงถูกแทนที่ ค่าเริ่มต้นจะใช้ในเวลาคอมไพล์ เมื่อคอมไพเลอร์ตรวจสอบว่าอาร์กิวเมนต์หายไปในการเรียกใช้ฟังก์ชัน คอมไพเลอร์จะแทนที่ค่าดีฟอลต์ที่ให้ไว้ ดังนั้นในโปรแกรมข้างต้น ค่าของ x จะถูกแทนที่ ณ เวลาคอมไพล์ และที่รันไทม์ คลาสที่ได้รับ s() จะถูกเรียก ค่าของ a จะถูกแทนที่ในเวลาคอมไพล์ และเมื่อเรียกใช้คลาสที่ได้รับ s() ของคลาสที่ได้รับจะถูกเรียก