ความแตกต่างระหว่างฟังก์ชั่นเสมือนและเพียวเสมือน

ผู้เขียน: Laura McKinney
วันที่สร้าง: 2 เมษายน 2021
วันที่อัปเดต: 13 พฤษภาคม 2024
Anonim
แข่งกินน้ำแข็ง ice
วิดีโอ: แข่งกินน้ำแข็ง ice

เนื้อหา


ฟังก์ชั่นเสมือนจริงและฟังก์ชั่นเสมือนบริสุทธิ์ทั้งสองเป็นแนวคิดของความแตกต่างเวลาทำงาน ความแตกต่างที่สำคัญระหว่าง ‘ฟังก์ชั่นเสมือนจริง และ 'ฟังก์ชั่นเสมือนจริง' คือ 'ฟังก์ชั่นเสมือนจริง' มีคำจำกัดความในคลาสพื้นฐานและคลาสที่สืบทอดที่ได้รับจะนิยามใหม่ ฟังก์ชั่นเสมือนบริสุทธิ์นั้นไม่มีคำจำกัดความในคลาสพื้นฐานและคลาสที่สืบทอดมาทั้งหมดจะต้องนิยามใหม่

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

ความแตกต่างได้รับการสนับสนุนโดยทั้งภาษา C ++ และ Java ใน Java คำว่า "การแทนที่" จะถูกใช้แทน 'ฟังก์ชั่นเสมือนจริง' เนื่องจากฟังก์ชันเสมือนเป็นคำของ C ++

  1. แผนภูมิเปรียบเทียบ
  2. คำนิยาม
  3. ความแตกต่างที่สำคัญ
  4. ข้อสรุป

แผนภูมิเปรียบเทียบ

พื้นฐานสำหรับการเปรียบเทียบฟังก์ชั่นเสมือนจริงฟังก์ชั่นเพียวเสมือน
ขั้นพื้นฐานฟังก์ชั่นเสมือนมีความหมายของพวกเขาในชั้นฐานฟังก์ชั่น 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; . . };

  1. ฟังก์ชั่นเสมือนจริงจะถูกกำหนดในคลาสฐานและกำหนดใหม่ (แทนที่) ในคลาสที่ได้รับ ในทางกลับกันฟังก์ชั่นเสมือนบริสุทธิ์ชั้นฐานไม่ได้กำหนดไว้ในชั้นฐานโดยเฉพาะ
  2. คลาสที่ได้รับมาหากต้องการนิยามใหม่ (แทนที่) ฟังก์ชันเสมือนในขณะที่ในกรณีของฟังก์ชันเสมือนบริสุทธิ์ที่ได้รับคลาสจะต้องกำหนดฟังก์ชันเสมือนบริสุทธิ์อีกครั้ง
  3. หากคลาสที่ได้รับล้มเหลวในการกำหนดใหม่ (แทนที่) ฟังก์ชันเสมือนมันสามารถใช้ฟังก์ชันเสมือนของคลาสพื้นฐานได้ ในทางกลับกันหากคลาสที่ได้รับล้มเหลวในการแทนที่ฟังก์ชั่นเสมือนจริงนั้นข้อผิดพลาดในการรวบรวมเกิดขึ้น
  4. คลาสพื้นฐานที่มีฟังก์ชันเสมือนนั้นสามารถสร้างอินสแตนซ์ได้นั่นคือสามารถสร้างวัตถุได้ หากเทียบกับคลาสพื้นฐานที่มีฟังก์ชันเสมือนบริสุทธิ์เช่นคลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้เนื่องจากคลาสนามธรรมไม่ได้ถูกกำหนดอย่างสมบูรณ์

บันทึก:
ต้นแบบของ 'ฟังก์ชันเสมือน' และ 'ฟังก์ชันเสมือนบริสุทธิ์' ยังคงเหมือนเดิมตลอดทั้งโปรแกรม

สรุป:

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