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

อาร์กิวเมนต์เริ่มต้นและฟังก์ชันเสมือน (Default arguments and virtual function) ใน 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() ของคลาสฐานถูกใช้

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