ความแตกต่างระหว่างฟังก์ชั่นเสมือนและเพียวเสมือน
เนื้อหา
- แผนภูมิเปรียบเทียบ
- นิยามของฟังก์ชั่นเสมือนจริง
- ประกาศ:
- การสืบทอดหลายระดับ
- นิยามของฟังก์ชั่น Pure Virtual
- ชั้นนามธรรม
- สรุป:
ฟังก์ชั่นเสมือนจริงและฟังก์ชั่นเสมือนบริสุทธิ์ทั้งสองเป็นแนวคิดของความแตกต่างเวลาทำงาน ความแตกต่างที่สำคัญระหว่าง ‘ฟังก์ชั่นเสมือนจริง และ 'ฟังก์ชั่นเสมือนจริง' คือ 'ฟังก์ชั่นเสมือนจริง' มีคำจำกัดความในคลาสพื้นฐานและคลาสที่สืบทอดที่ได้รับจะนิยามใหม่ ฟังก์ชั่นเสมือนบริสุทธิ์นั้นไม่มีคำจำกัดความในคลาสพื้นฐานและคลาสที่สืบทอดมาทั้งหมดจะต้องนิยามใหม่
อย่างไรก็ตามฟังก์ชั่นเสมือนจริงยังเรียกว่าการจัดส่งแบบไดนามิกและการจัดส่งแบบรันไทม์เนื่องจากฟังก์ชั่นที่เรียกว่ามีการระบุไว้ในเวลาทำงานให้สอดคล้องกับประเภทของวัตถุที่ใช้
ความแตกต่างได้รับการสนับสนุนโดยทั้งภาษา C ++ และ Java ใน Java คำว่า "การแทนที่" จะถูกใช้แทน 'ฟังก์ชั่นเสมือนจริง' เนื่องจากฟังก์ชันเสมือนเป็นคำของ C ++
- แผนภูมิเปรียบเทียบ
- คำนิยาม
- ความแตกต่างที่สำคัญ
- ข้อสรุป
แผนภูมิเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | ฟังก์ชั่นเสมือนจริง | ฟังก์ชั่นเพียวเสมือน |
---|---|---|
ขั้นพื้นฐาน | ฟังก์ชั่นเสมือนมีความหมายของพวกเขาในชั้นฐาน | ฟังก์ชั่น Pure Virtual ไม่มีคำจำกัดความในคลาสพื้นฐาน |
การประกาศ | virtual funct_name (พารามิเตอร์_list) {. . . . .}; | virtual funct_name (parameter_list) = 0; |
คลาสที่ได้รับมา | คลาสที่ได้รับทั้งหมดอาจหรือไม่อาจแทนที่ฟังก์ชันเสมือนของคลาสพื้นฐาน | คลาสที่ได้รับทั้งหมดต้องแทนที่ฟังก์ชันเสมือนของคลาสพื้นฐาน |
ผล | ฟังก์ชั่นเสมือนจริงเป็นลำดับชั้นในธรรมชาติ; มันจะไม่ส่งผลกระทบต่อการคอมไพล์หากคลาสใด ๆ ที่ได้รับไม่ได้แทนที่ฟังก์ชันเสมือนของคลาสพื้นฐาน | ถ้าคลาสที่ได้รับทั้งหมดล้มเหลวในการแทนที่ฟังก์ชันเสมือนของคลาสพื้นฐานข้อผิดพลาดในการรวบรวมจะเกิดขึ้น |
ชั้นนามธรรม | ไม่มีแนวคิด | หากคลาสมีฟังก์ชันเสมือนบริสุทธิ์อย่างน้อยหนึ่งฟังก์ชันจะมีการประกาศบทคัดย่อ |
นิยามของฟังก์ชั่นเสมือนจริง
ฟังก์ชั่นเสมือนจริง เป็นฟังก์ชั่นสมาชิกของคลาสฐานและมันถูกนิยามใหม่โดยคลาสที่ได้รับซึ่งสืบทอดคลาสฐาน ไม่จำเป็นว่าคลาสที่สืบทอดมาทั้งหมดจะต้องนิยามฟังก์ชันเสมือนใหม่อีกครั้ง แต่จะถูกนิยามใหม่โดยคลาสที่ได้รับซึ่งอาจต้องใช้ฟังก์ชันของมัน ฟังก์ชั่นเสมือนจริงถูกสร้างขึ้นโดยการประกาศฟังก์ชั่นในคลาสฐานนำหน้าด้วยคำหลัก 'เสมือน'.
ประกาศ:
คลาสฐาน {สาธารณะ: ประเภทเสมือน funt_name (พารามิเตอร์รายการ) {. . . }};
คลาสที่สืบทอดมาสามารถกำหนดฟังก์ชันเสมือนใหม่ได้โดยไม่ต้องมีคำหลัก "เสมือน" คลาสที่ได้รับมากำหนดฟังก์ชันเสมือนใหม่เพื่อให้งานสำเร็จ เนื่องจากฟังก์ชันเสมือนถูกนิยามใหม่ในคลาสที่ได้รับเราจึงมีฟังก์ชันเดียวกันหลายรูปแบบ ตอนนี้ฟังก์ชันรุ่นใดที่ถูกเรียกขึ้นอยู่กับชนิดของวัตถุที่เรียกว่าเรียกใช้ฟังก์ชันนั้น
การสืบทอดหลายระดับ
ในการสืบทอดหลายระดับซึ่งคลาสที่ได้รับซึ่งสืบทอดฟังก์ชันเสมือนจากคลาสฐานของมันเองเมื่อมันถูกใช้เป็นคลาสพื้นฐานสำหรับคลาสอื่นที่ได้รับมาฟังก์ชันเสมือนก็ยังสามารถถูกแทนที่ได้ ดังนั้นเมื่อฟังก์ชั่นเสมือนได้รับการถ่ายทอดลักษณะเสมือนของมันก็จะได้รับมรดก
ฟังก์ชั่นเสมือนจริงยังเป็นลำดับชั้นในลักษณะเช่นถ้าคลาสที่ได้รับไม่ได้แทนที่ / กำหนดฟังก์ชันเสมือนที่สืบทอดมาจากคลาสฐานและเมื่อวัตถุของคลาสที่ได้รับมาเรียกใช้ฟังก์ชันเสมือนนั้นฟังก์ชันเสมือนที่กำหนดโดยคลาสพื้นฐานจะถูกเรียกใช้
นิยามของฟังก์ชั่น Pure Virtual
ตามที่เห็นด้านบนหากคลาสที่ได้รับไม่ได้แทนที่ฟังก์ชันเสมือนดังนั้นฟังก์ชันเสมือนที่กำหนดโดยคลาสพื้นฐานจะถูกใช้ แต่ถ้าชั้นฐานตัวเองไม่ได้กำหนดฟังก์ชั่นเสมือนจริง หลายครั้งที่คลาสฐานนั้นไม่มีคำจำกัดความสำหรับฟังก์ชันเสมือนหรือบางครั้งคุณต้องการให้คลาสที่ได้รับทั้งหมดต้องแทนที่ฟังก์ชันเสมือน
เพื่อจัดการกับทั้งสองสถานการณ์ข้างต้น C ++ สนับสนุนแนวคิดของ“ฟังก์ชั่นเพียวเสมือน“ 'ฟังก์ชั่นเสมือนจริง' ถูกประกาศในคลาสพื้นฐาน แต่ไม่มีคำจำกัดความในคลาสพื้นฐาน ฟังก์ชั่นเสมือนล้วนมีการประกาศดังนี้
ประเภทเสมือน funct_name (parameter_list) = 0;
เมื่อใดก็ตามที่ฟังก์ชั่นเสมือนจริงในคลาสฐานถูกทำให้เป็น "บริสุทธิ์" แล้วแต่ละคลาสที่ได้รับจะต้องแทนที่ฟังก์ชันเสมือนจริงของคลาสพื้นฐาน หากคลาสที่ได้รับล้มเหลวในการแทนที่ฟังก์ชันเสมือนบริสุทธิ์ของคลาสพื้นฐานจะส่งผลให้เกิดข้อผิดพลาดในการรวบรวม
ชั้นนามธรรม
คลาสที่มีฟังก์ชั่น pure อย่างน้อยหนึ่งฟังก์ชันเรียกว่า 'abstract class' ไม่สามารถสร้างวัตถุของคลาสนามธรรมได้ แต่คุณสามารถสร้างการอ้างอิงและพอยน์เตอร์ไปยังคลาสนามธรรมได้ สมาชิกของคลาสนามธรรมสามารถเข้าถึงได้ผ่านวัตถุของคลาสที่ได้รับซึ่งสืบทอดคลาสฐานนามธรรม
คลาสที่คุณต้องการประกาศ abstract ให้ใช้คีย์เวิร์ด 'บทคัดย่อ' อยู่ด้านหน้าของ ‘คลาส’ คำสำคัญ.
// ตัวอย่างเช่นคลาสคลาสนามธรรมชื่อ {. . ประเภทเสมือน funct_name (parameter_list) = 0; . . };
- ฟังก์ชั่นเสมือนจริงจะถูกกำหนดในคลาสฐานและกำหนดใหม่ (แทนที่) ในคลาสที่ได้รับ ในทางกลับกันฟังก์ชั่นเสมือนบริสุทธิ์ชั้นฐานไม่ได้กำหนดไว้ในชั้นฐานโดยเฉพาะ
- คลาสที่ได้รับมาหากต้องการนิยามใหม่ (แทนที่) ฟังก์ชันเสมือนในขณะที่ในกรณีของฟังก์ชันเสมือนบริสุทธิ์ที่ได้รับคลาสจะต้องกำหนดฟังก์ชันเสมือนบริสุทธิ์อีกครั้ง
- หากคลาสที่ได้รับล้มเหลวในการกำหนดใหม่ (แทนที่) ฟังก์ชันเสมือนมันสามารถใช้ฟังก์ชันเสมือนของคลาสพื้นฐานได้ ในทางกลับกันหากคลาสที่ได้รับล้มเหลวในการแทนที่ฟังก์ชั่นเสมือนจริงนั้นข้อผิดพลาดในการรวบรวมเกิดขึ้น
- คลาสพื้นฐานที่มีฟังก์ชันเสมือนนั้นสามารถสร้างอินสแตนซ์ได้นั่นคือสามารถสร้างวัตถุได้ หากเทียบกับคลาสพื้นฐานที่มีฟังก์ชันเสมือนบริสุทธิ์เช่นคลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้เนื่องจากคลาสนามธรรมไม่ได้ถูกกำหนดอย่างสมบูรณ์
บันทึก:
ต้นแบบของ 'ฟังก์ชันเสมือน' และ 'ฟังก์ชันเสมือนบริสุทธิ์' ยังคงเหมือนเดิมตลอดทั้งโปรแกรม
สรุป:
'ฟังก์ชั่นเสมือนจริง' และ 'ฟังก์ชั่นเสมือนบริสุทธิ์' ทั้งสองมีความสำคัญเช่นเดียวกับใน 'ฟังก์ชั่นเสมือน' ทุกคลาสที่ได้รับไม่จำเป็นต้องกำหนดฟังก์ชั่นเสมือนจริงและที่เราต้องการให้ทุกคลาสที่ได้รับมา ฟังก์ชั่นที่ดีที่สุดใช้มี