ฟังก์ชั่นเสมือนจริงคืออะไร?

ฟังก์ชั่นเสมือนจริงเป็นฟังก์ชั่นที่กำหนดไว้ในซูเปอร์คลาสที่จะต้องมีอยู่ในคลาสย่อยสำหรับคลาสย่อยนั้นจะมีคำจำกัดความคลาสที่สมบูรณ์ ฟังก์ชั่นเสมือนอาศัยกระบวนทัศน์การเขียนโปรแกรมเชิงวัตถุที่เรียกว่าการสืบทอดเสมือนจริงซึ่งพบเห็นได้ทั่วไปใน C ++ โดยใช้คำสำคัญ "เสมือน" ในการกำหนดฟังก์ชั่นเสมือนจริงจำเป็นต้องใช้สองคลาสซูเปอร์คลาสและคลาสย่อย ซูเปอร์คลาสคือที่ที่ฟังก์ชันถูกประกาศใช้ครั้งแรกและอาจมีการกำหนดไว้ คลาสย่อยเป็นที่ที่ฟังก์ชันถูกกำหนด - หรือแทนที่ขึ้นอยู่กับว่าฟังก์ชันนั้นถูกกำหนดในซูเปอร์คลาส

ฟังก์ชันเสมือนสามารถกำหนดได้ด้วยวิธีใดวิธีหนึ่งจากสองวิธี ครั้งแรกมันสามารถกำหนดเป็นต้นขั้วซึ่งมีร่างกายที่ว่างเปล่าและไม่ทำอะไรเลย ประการที่สองมันอาจถูกกำหนดให้เป็นฟังก์ชั่นเสมือนบริสุทธิ์โดยที่มันถูกกำหนดเป็น NULL ในไฟล์ส่วนหัวของซูเปอร์คลาส

มีข้อดีและข้อเสียของวิธีการทั้งสอง การกำหนดฟังก์ชั่นเป็นสตับทำให้แน่ใจว่าคลาสย่อยทั้งหมดมีการนำไปปฏิบัติบางอย่างแม้ว่ามันจะไม่ทำอะไรก็ตาม หากลืมที่จะแทนที่ฟังก์ชั่นและนำไปใช้อย่างถูกต้องในคลาสย่อยจะไม่มีข้อผิดพลาดหรือคำเตือนปรากฏขึ้น ในทางตรงกันข้ามการกำหนดฟังก์ชั่นเสมือนที่บริสุทธิ์นั้นต้องการให้แต่ละคลาสย่อยมีคำจำกัดความของฟังก์ชั่นของตัวเองและข้อผิดพลาดจะปรากฏขึ้นหากนี่ไม่ใช่กรณี

อย่างไรก็ตามฟังก์ชันเสมือนอยู่ภายใต้กฎการสืบทอดเดียวกันกับฟังก์ชันที่ไม่ใช่แบบเสมือนดังนั้นลำดับชั้นการสืบทอดที่มีมากกว่าสองระดับอาจไม่ต้องการคำจำกัดความที่ชัดเจนของฟังก์ชันเสมือน ตัวอย่างเช่นหนึ่งสามารถพิจารณาคลาส A ที่ประกาศฟังก์ชันเสมือนซึ่งถูกนำไปใช้ในคลาสย่อย B. คลาส B มีคลาสย่อยของตัวเองคลาส C คลาส C ไม่ต้องการนิยามที่ชัดเจนของฟังก์ชันคลาส A เนื่องจากสืบทอด คำนิยามจากคลาส B หากจำเป็นคลาส C สามารถแทนที่ฟังก์ชันคลาส B หรือแทนที่ฟังก์ชันคลาส B ในขณะที่เรียกมันได้เช่นกัน

ที่สุดโต่งอื่น ๆ ฟังก์ชั่นเสมือนไม่จำเป็นต้องกำหนดในคลาสย่อยถ้าพวกเขาจะประกาศเสมือนในคลาสย่อยนั้น ตัวอย่างเช่นเราสามารถพิจารณาคลาส A ที่ประกาศฟังก์ชันเสมือนและมีคลาสย่อยสองคลาสคือ B และ C นอกจากนี้เราสามารถจินตนาการได้ว่าคลาส B มีคลาสย่อย D และ E และคลาสย่อย C มีคลาสย่อย F และ G

คลาส B ถึง G ทุกคนต้องมีฟังก์ชั่นเสมือนจริงของคลาส A อย่างใด หากคลาส B มีการใช้งานฟังก์ชั่นของ A คลาส D และ E ไม่จำเป็นต้องทำซ้ำ บางทีคลาสย่อยของ C จำเป็นต้องใช้ฟังก์ชั่นของ A แต่ทั้งคู่ทำอะไรที่แตกต่างออกไปดังนั้นการกำหนดฟังก์ชั่นในคลาส C นั้นจะไม่เป็นประโยชน์ ในกรณีดังกล่าวฟังก์ชันอาจถูกประกาศเสมือนในคลาส C และไม่จำเป็นต้องมีการใช้งาน

ฟังก์ชั่นเสมือนสามารถเรียนรู้ได้ แต่เมื่อใช้อย่างถูกต้องพวกเขาสามารถลดการทำซ้ำรหัสและทำให้เข้าใจรหัสได้ง่ายขึ้น มีข้อผิดพลาดมากมายที่มีฟังก์ชั่นเสมือน แต่โดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับมรดกหลาย ในหลาย ๆ การสืบทอดมันเป็นไปได้ที่ฟังก์ชันเสมือนที่กำหนดไว้ไม่ชัดเจนจะขัดแย้งกันดังนั้นจึงควรใช้ด้วยความระมัดระวังในบริบทนั้น