ก่อนอื่น เรามาแนะนำจุดความรู้ใหม่ของเรา— ฟังก์ชันเสมือน
นี่คือฟังก์ชั่นประเภทไหน? พูดง่ายๆ ก็คือเป็นฟังก์ชันที่ประกาศด้วย virtual ไว้ข้างหน้าฟังก์ชัน รูปแบบทั่วไปจะเป็นดังนี้:
ชื่อฟังก์ชันส่งคืนฟังก์ชันเสมือน (พารามิเตอร์อย่างเป็นทางการ) {function body}
แล้วมันใช้ทำอะไร? การเกิดขึ้นของฟังก์ชันเสมือนทำให้สามารถเชื่อมต่อระหว่างฟังก์ชันและเนื้อหาของฟังก์ชันได้ในขณะรันไทม์ ซึ่งเรียกว่า การเชื่อมโยงแบบไดนามิก จากนั้นเมื่อคลาสที่ได้รับของฟังก์ชันเสมือนกำลังทำงานอยู่ ผลของการดำเนินการด้วยวิธีเดียวกันแต่ด้วยผลลัพธ์ที่แตกต่างกันนั้นสามารถทำได้ตามการเชื่อมโยงแบบไดนามิกที่รันไทม์ ซึ่งเรียก ว่าความหลากหลาย ด้วยวิธีนี้จะมีวิธีแก้ปัญหาในส่วนก่อนหน้า
ต่อไป เราเพียงต้องประกาศวิธีพื้นที่ในคลาสพื้นฐานเป็นฟังก์ชันเสมือน จากนั้นพอยน์เตอร์หรือการอ้างอิงประเภท Point ในฟังก์ชันหลักสามารถเรียกได้อย่างกล้าหาญ และไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาประเภท เพราะพวกเขาจะตัดสินใจว่าจะเรียกวิธีการใดตามประเภทวัตถุจริงเพื่อให้ได้การเชื่อมโยงแบบไดนามิก
รหัสมีดังนี้:
/************************************//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;}virtualdoublearea(){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;}
หลังจากแก้ไขแล้ว ให้คอมไพล์และรันดังนี้:
โปรดทดลองบนคอมพิวเตอร์ของคุณเองเพื่อสัมผัสกับบทบาทของฟังก์ชันเสมือนและความหลากหลาย
สิ่งที่ควรทราบคือ:
1. ฟังก์ชันเสมือนไม่สามารถเป็นฟังก์ชันสมาชิกแบบคงที่หรือฟังก์ชันเพื่อนได้เนื่องจากไม่ได้อยู่ในวัตถุ
2. ฟังก์ชันแบบอินไลน์ไม่สามารถระบุตำแหน่งแบบไดนามิกระหว่างรันไทม์ได้ แม้ว่าจะมีการกำหนดฟังก์ชันเสมือนไว้ภายในคลาส แต่ก็จะยังคงถือว่าไม่ใช่แบบอินไลน์ในระหว่างการคอมไพล์
3. ตัวสร้างไม่สามารถเป็นฟังก์ชันเสมือนได้ และตัวทำลายสามารถเป็นฟังก์ชันเสมือนได้ และโดยปกติแล้วจะประกาศเป็นฟังก์ชันเสมือน