ความหลากหลาย
Polymorphism เป็นหนึ่งในคุณสมบัติที่สำคัญของการเขียนโปรแกรมเชิงวัตถุ ความหมายตามตัวอักษรสามารถเข้าใจได้ง่ายว่า: หลายรูปแบบ, หลายรูปลักษณ์ ในความเป็นจริง ความหมายสำคัญจะเหมือนกัน ในการเขียนโปรแกรมเชิงวัตถุ หมายความว่าวิธีการเดียวกันจะมีผลการดำเนินการที่แตกต่างกันเมื่อดำเนินการด้วยวัตถุที่แตกต่างกัน
โดยเฉพาะอย่างยิ่ง การดำเนินการของความหลากหลาย สามารถแบ่งออกเป็นสองประเภท: ความหลากหลายเวลาคอมไพล์ และความหลากหลายเวลารันไทม์ อย่างแรกคือกระบวนการดำเนินการเฉพาะที่กำหนดเมื่อทำการคอมไพล์ และอย่างหลังคือกระบวนการดำเนินการที่กำหนดเฉพาะระหว่างการรันโปรแกรมเท่านั้น การกำหนดกระบวนการดำเนินการนี้ มีผลผูกพัน หรือที่เรียกว่า การมีผลผูกพัน
การเชื่อมโยงที่ได้รับการยืนยันระหว่างการคอมไพล์และการเชื่อมต่อเรียกว่า การเชื่อมโยงแบบคง ที่ ฟังก์ชันการโอเวอร์โหลดและการสร้างอินสแตนซ์ของเทมเพลตฟังก์ชันที่เราเรียนรู้ก่อนหน้านี้จัดอยู่ในหมวดหมู่นี้ อีกประการหนึ่งคือการยืนยันว่าโค้ดชิ้นใดถูกดำเนินการเมื่อรันอยู่ ซึ่งเรียกว่า การเชื่อมโยงแบบไดนามิก ในกรณีนี้ ไม่สามารถยืนยันได้ว่าโค้ดชิ้นใดถูกดำเนินการเมื่อทำการคอมไพล์ แต่สามารถยืนยันได้หลังจากโปรแกรมเท่านั้น วิ่ง.
เมื่อเปรียบเทียบทั้งสองแบบแล้ว การเชื่อมโยงแบบคงที่ได้กำหนดวิธีการดำเนินการในระหว่างการคอมไพล์แล้ว ดังนั้นจึงมีประสิทธิภาพในการดำเนินการ ในขณะที่การเชื่อมโยงแบบไดนามิกจะต้องช้ากว่า แต่ข้อดีคือความยืดหยุ่น ทั้งสองมีข้อดีและสถานการณ์การใช้งานที่แตกต่างกัน
ด้านล่างนี้ เราจะยกตัวอย่างง่ายๆ เกี่ยวกับการเชื่อมโยงแบบคงที่ให้กับคุณ:
/************************************//Des: การสาธิตการสอน C++//Author: Huang/ /ลิขสิทธิ์:www.dotcpp.com//วันที่:20/12/2017********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}doublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;จุด*p;p=&B;cout<<p->พื้นที่()<<endl;จุด&pp=B;cout<<pp.area()<<endl;return0;}
มีการกำหนดคลาสไว้สองคลาส ได้แก่ คลาสดอทและคลาสวงกลมที่ได้รับ คุณสามารถดูโค้ดของฟังก์ชันหลักและผลลัพธ์พื้นที่เอาต์พุตทั้งสี่ได้ดังนี้:
คุณสามารถเปรียบเทียบโค้ดเพื่อทำความเข้าใจผลลัพธ์ทั้งสี่:
ศาลแรกส่งออกพื้นที่ของ A ซึ่งเป็นวิธีพื้นที่ในคลาสจุด พื้นที่เป็น 0 ดังนั้นจึงไม่มีปัญหา
การคำนวณครั้งที่สองจะแสดงพื้นที่ B ซึ่งเห็นได้ชัดว่าเป็นวิธีการหาพื้นที่ของคลาส Circle ที่ได้รับมา พื้นที่นี้คำนวณตามธรรมชาติตามสูตรและค่าคือ 1256.64 ซึ่งไม่มีปัญหา
cout ที่สามส่งออกวิธีการพื้นที่ของออบเจ็กต์คลาส Circle ที่ชี้โดยตัวชี้ประเภท Point p ซึ่งจะส่งออกเป็น 0 ซึ่งเห็นได้ชัดว่าเป็นวิธีการในพื้นที่ในคลาส Point สิ่งที่ C++ ใช้ที่นี่คือการเชื่อมโยงแบบคงที่ กล่าวคือ เมื่อทำการคอมไพล์ จะกำหนดพื้นที่ที่จะดำเนินการตามประเภทของ p ดังนั้นจึงเป็น 0
cout ประเภทที่สี่ทำงานในลักษณะเดียวกัน โดยกำหนดวัตถุประเภท Circle ให้กับการอ้างอิงประเภท Point ด้วย
แน่นอนว่านี่ไม่ใช่ผลลัพธ์ที่เราคาดหวัง ที่จริงแล้ว สำหรับพอยน์เตอร์และการอ้างอิง เราต้องการดำเนินการวิธีการของออบเจ็กต์จริง แทนที่จะกำหนดประเภทของพอยน์เตอร์และการอ้างอิงแบบสุ่มสี่สุ่มห้า นี่คือปัญหาหากเขียนเช่นนี้
หากคุณต้องการตอบสนองความต้องการของเรา ไม่ว่าตัวชี้หรือการอ้างอิงจะเป็นประเภทใดก็ตาม ควรตัดสินใจอย่างยืดหยุ่นโดยพิจารณาจากวัตถุจริงที่ชี้ไป จากนั้นเราจำเป็นต้องเปลี่ยนวิธีการผูกแบบคงที่เริ่มต้นนี้ และใช้การเชื่อมโยงแบบไดนามิก นั่นคือ ตัดสินใจได้อย่างยืดหยุ่นเมื่อรันไทม์
ในส่วนถัดไป เราจะอธิบายฟังก์ชันเสมือนโดยละเอียดให้ทุกคนทราบ!