c ++ polymorphism
ความแตกต่างอย่างแท้จริงหมายความว่ามีความหลากหลายของรูปแบบเมื่อความสัมพันธ์ระหว่างระดับผ่านการถ่ายทอดทางพันธุกรรมระหว่างลำดับชั้นและจะนำมาใช้ในหลายรูปแบบ
เมื่อ c ++ ฟังก์ชันสมาชิกเรียกเฉลี่ย polymorphic จะให้ทำหน้าที่ที่แตกต่างกันขึ้นอยู่กับชนิดของวัตถุที่ฟังก์ชั่นที่เรียกว่า
ตัวอย่างต่อไปนี้รูปร่างชั้นฐานที่ได้มาสำหรับสองประเภทดังต่อไปนี้:
#include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ public: Rectangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape{ public: Triangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // 程序的主函数 int main( ) { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // 存储矩形的地址 shape = &rec; // 调用矩形的求面积函数 area shape->area(); // 存储三角形的地址 shape = &tri; // 调用三角形的求面积函数 area shape->area(); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Parent class area Parent class area
สาเหตุของการเกิดข้อผิดพลาดคือการส่งออกโทรพื้นที่ฟังก์ชัน ()ถูกกำหนดให้เป็นรุ่นคอมไพเลอร์ชั้นฐานนี้เรียกว่ามีหลายรูปแบบคงที่หรือการเชื่อมโยงแบบคงที่- ฟังก์ชั่นที่เรียกว่าก่อนที่จะดำเนินการโครงการที่มีความพร้อมบางครั้งก็จะเรียกว่าการรวมก่อนเพราะฟังก์ชั่นพื้นที่ () ในระหว่างการรวบรวมโปรแกรมที่ได้รับการตั้งค่า
แต่ตอนนี้ให้โปรแกรมแก้ไขเล็กน้อยในชั้นเรียนรูปร่าง, พื้นที่แรก ()วางคำสั่งเสมือนคำหลักดังต่อไปนี้:
class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } };
หลังจากการปรับเปลี่ยนเมื่อรวบรวมและดำเนินการในด้านหน้าของโค้ดตัวอย่างก็จะก่อให้เกิดผลต่อไปนี้:
Rectangle class area Triangle class area
ในกรณีนี้คอมไพเลอร์เป็นตัวชี้เพื่อดูเนื้อหามากกว่าชนิดของมัน ดังนั้นตั้งแต่ไตรจัดเก็บข้อมูลที่อยู่และวัตถุระดับ REC ในรูปร่าง * และมันจะเรียกพื้นที่ที่เกี่ยวข้อง () ฟังก์ชัน
ในขณะที่คุณสามารถดูแต่ละชั้นมีพื้นที่ย่อยฟังก์ชั่น () เพื่อบรรลุความเป็นอิสระ นี่คือการใช้งานทั่วไปpolymorphicด้วยความแตกต่างที่คุณสามารถมีชั้นเรียนที่แตกต่างกันทั้งหมดที่มีชื่อเดียวกัน แต่พารามิเตอร์ของฟังก์ชั่นที่เป็นฟังก์ชั่นยังสามารถมีการใช้งานที่แตกต่างกันของเดียวกัน
ฟังก์ชั่นเสมือนจริง
ฟังก์ชั่นเสมือนจริงที่ถูกประกาศใช้คำสำคัญเสมือนในฟังก์ชั่นชั้นฐานเมื่อสร้างนิยามใหม่ชั้นฐานฟังก์ชันเสมือนที่กำหนดไว้ในชั้นเรียนมาจะบอกคอมไพเลอร์ไม่ได้เชื่อมโยงแบบคงที่เพื่อฟังก์ชั่น
สิ่งที่เราต้องการคือจุดใด ๆในโปรแกรมที่สามารถเลือกได้ตามประเภทของการเรียกฟังก์ชันวัตถุเรียกการดำเนินการนี้จะเรียกว่าการเชื่อมโยงแบบไดนามิกหรือมีผลผูกพันปลาย
ฟังก์ชั่นเสมือนบริสุทธิ์
คุณอาจต้องการที่จะกำหนดฟังก์ชั่นเสมือนในชั้นฐานจึงเรียนมา redefine ฟังก์ชั่นที่ดีเหมาะสำหรับวัตถุ แต่คุณไม่สามารถให้การดำเนินงานที่มีความหมายของการทำงานเสมือนในชั้นฐานที่เวลานี้จะมี ใช้ฟังก์ชั่นเสมือนบริสุทธิ์
เราสามารถฐานพื้นที่ทำงานเสมือนระดับ () เพื่ออ่านดังนี้:
class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } // pure virtual function virtual int area() = 0; };
= 0บอกคอมไพเลอร์ที่ฟังก์ชั่นที่มีร่างกายไม่เหนือทำงานเสมือนเป็นหน้าที่เสมือนบริสุทธิ์