ฟังก์ชั่นแทนที่และโอเวอร์โหลดใน C ++ และ Delphi
Spacesoft 【 Dark Night Sand 】
ในการเขียนโปรแกรมเชิงวัตถุเมื่อ subclass ดำเนินการต่อฟังก์ชั่นจากคลาสฐาน subclass อาจต้องจัดการกับฟังก์ชั่นบางอย่างแตกต่างจากคลาสฐานเช่น::
ชั้นเรียน chuman
-
สาธารณะ:
เป็นโมฆะ saymyname () // พิมพ์ชื่อวัตถุ
-
ศาล << สวัสดีฉันเป็นมนุษย์ << endl;
-
-
ถ้าเป็นที่ชัดเจนถ้า subclass ของมันมีฟังก์ชั่น saymyname ที่มีชื่อเดียวกันพารามิเตอร์เดียวกันและค่าส่งคืน (หนึ่งประโยคฟังก์ชันเดียวกัน) มันจะเรียกฟังก์ชันใด ตัวอย่างเช่นตอนนี้มีคลาส C
Class Cmark: Chuman สาธารณะ
-
สาธารณะ:
โมฆะ saymyname ()
-
ศาล << สวัสดีฉันเป็นเครื่องหมาย << endl;
-
-
จากนั้นเราต้องถามส่วนโปรแกรมต่อไปนี้:
Chuman *pH = ใหม่ cmark;
ถ้า (pH)
ph-> saymyname ();
อื่น
ศาล << เกิดข้อผิดพลาด!
ลบค่า pH;
pH = null;
สวัสดีฉันเป็นมาร์คที่เราต้องการพิมพ์ออกมาหรือไม่?
เลขที่. มันส่งออกสวัสดีฉันเป็นมนุษย์ มันแย่มากและเมื่อเราชี้ไปที่คน ๆ หนึ่งและขอให้เขาพูดชื่อของเขาเขาบอกเราว่าเขาเป็น "คน" แทนที่จะพูดชื่อของเขา เหตุผลสำหรับปัญหานี้คือการชี้ไปที่คลาสที่ได้รับสาธารณะด้วยตัวชี้คลาสฐานคุณสามารถเข้าถึงฟังก์ชั่นสมาชิกของคลาสที่ได้รับซึ่งดำเนินการต่อจากคลาสฐาน แต่ถ้ามีฟังก์ชั่นที่มีชื่อเดียวกันในคลาสที่ได้รับผลลัพธ์ก็ยังคงเข้าถึงฟังก์ชั่นของชื่อเดียวกันของคลาสพื้นฐานแทนที่จะเป็นฟังก์ชันของคลาสที่ได้รับเอง ในความเป็นจริงสิ่งที่เราต้องการคือการพิจารณาว่าฟังก์ชั่นเหล่านี้ของชื่อเดียวกันควรถูกเรียกโดยประเภทจริงของวัตถุนั่นคือความละเอียดดังกล่าวเป็นแบบไดนามิก หรือเราสามารถพูดได้ว่าเมื่อวัตถุเป็นชนิดย่อยการใช้ชื่อเดียวกันในคลาสย่อยจะแทนที่การใช้งานของคลาสฐาน
เริ่มต้นด้วยการจัดการปัญหานี้กันเถอะ
นี่เป็นตัวอย่างทั่วไปของ polymorphism ใน C ++ เพื่อเฉพาะเจาะจงมันคือการใช้คำสำคัญเสมือนจริงเพื่ออธิบายฟังก์ชั่นเป็นฟังก์ชันเสมือนจริง
ชั้นเรียน chuman
-
สาธารณะ:
Virtual Void Saymyname () // พิมพ์ชื่อวัตถุ
-
ศาล << สวัสดีฉันเป็นมนุษย์ << endl;
-
-
ด้วยวิธีนี้รหัสอื่น ๆ ยังคงเหมือนเดิม แต่ CMark ของเรารู้วิธีพูดชื่อแล้ว ไม่สำคัญว่าฟังก์ชั่น SayMyname () ของ CMark ได้เพิ่มคำสำคัญเสมือนจริงหรือไม่เพราะตามบทบัญญัติของไวยากรณ์ C ++ เพราะมันแทนที่ฟังก์ชั่น Chuman ของชื่อเดียวกันมันจะกลายเป็นเสมือนจริง ทำไมคำสำคัญเสมือนจึงมีเอฟเฟกต์วิเศษเช่นนี้? C ++ FAQ Lite อธิบายสิ่งนี้ดังนี้: ใน C ++, "ฟังก์ชั่นสมาชิกเสมือนได้รับการพิจารณาแบบไดนามิก (ที่รันไทม์) นั่นคือฟังก์ชั่นสมาชิก (ที่รันไทม์) ถูกเลือกแบบไดนามิกและการเลือกจะขึ้นอยู่กับประเภทของวัตถุไม่ใช่ ประเภทของตัวชี้/การอ้างอิงถึงวัตถุนั้น " ดังนั้นค่า pH ของเราพบว่าจริง ๆ แล้วมันชี้ไปที่วัตถุประเภท CMark ไม่ใช่ Chuman ที่ประกาศตามประเภทของตัวเองดังนั้นจึงเรียกว่า Saymyname ของ CMark
Delphi ใช้คำสำคัญเพื่อแสดงให้เห็นถึงการแทนที่ฟังก์ชั่น ฟังก์ชั่นที่เขียนทับจะต้องเป็นเสมือนหรือไดนามิกนั่นคือฟังก์ชั่นควรมีหนึ่งในสองตัวบ่งชี้นี้เมื่อประกาศเช่น:
การวาดขั้นตอน;
เมื่อคุณต้องการแทนที่คุณเพียงแค่ต้องทำการรวมตัวใหม่ด้วยตัวบ่งชี้การแทนที่ในคลาสย่อย
ขั้นตอนการจับ;
การประกาศทางไวยากรณ์เป็นเสมือนและไดนามิกเทียบเท่า ความแตกต่างคือการปรับความเร็วในการใช้งานให้เหมาะสมในขณะที่หลังเพิ่มขนาดรหัสให้เหมาะสม
จะเป็นอย่างไรถ้าทั้งคลาสฐานและคลาสย่อยมีชื่อฟังก์ชันและพารามิเตอร์เดียวกันและตัวบ่งชี้การแทนที่จะไม่ถูกเพิ่มลงในคลาสย่อย? สิ่งนี้ยังถูกต้องทางไวยากรณ์ ซึ่งหมายความว่าการใช้งานฟังก์ชั่นของฟังก์ชั่น subclass จะซ่อนการใช้งานของคลาสฐานแม้ว่าทั้งคู่มีอยู่ในคลาสที่ได้รับ จากนั้นกลับไปที่สถานการณ์ที่แสดงในตัวอย่างแรกในตอนต้นของบทความนี้: เมื่อเราชี้ไปที่บุคคลและขอให้เขาพูดชื่อของเขาเองเขาบอกเราว่าเขาเป็น "คน" แทนที่จะพูดของเขาเอง ชื่อ.
เป็นที่น่าสังเกตว่าไม่เหมือนกับฟังก์ชั่นการโอเวอร์โหลดและฟังก์ชั่นการโอเวอร์โหลดที่เรามักจะเรียกว่าโอเวอร์โหลดใน C ++ ใน Delphi มีเพียงการโอเวอร์โหลดเท่านั้นคือสิ่งที่เรามักจะเรียกว่าการทำงานมากเกินไป แน่นอนว่าเมื่อฟังก์ชั่นที่ลดลงเกินพิกัดนั้นเหมือนกับพารามิเตอร์ฟังก์ชันของคลาสพื้นฐานการใช้งานคลาสพื้นฐานจะถูกซ่อนไว้เช่นเดียวกับที่กล่าวไว้ข้างต้น การแทนที่หมายถึงการทำให้ฟังก์ชั่นที่ถูกเขียนทับและเขียนทับและเขียนทับและการใช้งานดั้งเดิมจะหายไป ด้วยเหตุนี้บทความจำนวนมากและหนังสือบางเล่มได้แปลการแทนที่การโอเวอร์โหลดโดยไม่เหมาะสมซึ่งฉันคิดว่าไม่เหมาะสม