หากไม่มีการแจกจ่ายแบบไดนามิก (polymorphism) "เมธอด" เป็นเพียงฟังก์ชันน้ำตาลอาจมีพารามิเตอร์เพิ่มเติมโดยนัย ดังนั้นอินสแตนซ์ของคลาสที่ไม่มีพฤติกรรม polymorphic นั้นเป็นหลัก C struct
s เพื่อจุดประสงค์ในการสร้างรหัส
สำหรับการกระจายแบบไดนามิกแบบคลาสสิกในระบบชนิดสแตติกมีกลยุทธ์หนึ่งที่โดดเด่น: vtables ทุกอินสแตนซ์ได้รับตัวชี้เพิ่มเติมอีกหนึ่งตัวที่อ้างถึง (การ จำกัด การแสดงออก) ชนิดของมันสิ่งสำคัญที่สุดคือ vtable: อาเรย์ของพอยน์เตอร์ของฟังก์ชันหนึ่งตัวต่อวิธี เนื่องจากชุดเต็มของวิธีการสำหรับทุกประเภท (ในห่วงโซ่การสืบทอด) เป็นที่รู้จักกันในเวลารวบรวมหนึ่งสามารถกำหนดดัชนีต่อเนื่อง (0..N สำหรับวิธีการ N) กับวิธีการและเรียกใช้วิธีการโดยการค้นหาตัวชี้ฟังก์ชั่นใน vtable โดยใช้ดัชนีนี้ (อีกครั้งผ่านการอ้างอิงอินสแตนซ์เป็นพารามิเตอร์เพิ่มเติม)
สำหรับภาษาที่ใช้คลาสแบบไดนามิกมากขึ้นโดยทั่วไปคลาสของตัวเองจะเป็นออบเจ็กต์ชั้นหนึ่งและแต่ละออบเจ็กต์จะมีการอ้างอิงไปยังออบเจกต์คลาส ในทางกลับกันคลาสอ็อบเจ็กต์เป็นเจ้าของเมธอดในลักษณะที่ขึ้นกับภาษาบางอย่าง (ใน Ruby เมธอดเป็นส่วนหลักของโมเดลวัตถุใน Python พวกมันเป็นเพียงฟังก์ชั่นของวัตถุ โดยทั่วไปคลาสจะจัดเก็บการอ้างอิงถึงซูเปอร์คลาส (es) ของพวกเขาเช่นกันและมอบหมายการค้นหาวิธีการสืบทอดให้กับคลาสเหล่านั้นเพื่อช่วย metaprogramming ซึ่งจะเพิ่มและเปลี่ยนแปลงวิธีการ
มีระบบอื่น ๆ อีกมากมายที่ไม่ได้ขึ้นอยู่กับคลาส แต่แตกต่างกันอย่างมีนัยสำคัญดังนั้นฉันจะเลือกทางเลือกการออกแบบที่น่าสนใจเพียงทางเดียว: เมื่อคุณสามารถเพิ่มวิธีการใหม่ ๆ เช่นคลาสของประเภทใน Haskell และลักษณะใน Rust) วิธีการแบบเต็มรูปแบบไม่เป็นที่รู้จักในขณะที่รวบรวม ในการแก้ไขปัญหานี้จะสร้าง vtable ต่อลักษณะและส่งผ่านเมื่อจำเป็นต้องใช้งานคุณลักษณะ นั่นคือรหัสเช่นนี้:
void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);
ถูกรวบรวมลงในสิ่งนี้:
functionpointer SomeTrait_ConcreteType_vtable[] = { &method1, &method2, ... };
void needs_a_trait(void *x, functionpointer vtable[]) { vtable[1](x, 1); }
ConcreteType x = ...;
needs_a_trait(x, SomeTrait_ConcreteType_vtable);
นอกจากนี้ยังหมายความว่าข้อมูล vtable ไม่ได้ฝังอยู่ในวัตถุ หากคุณต้องการการอ้างอิงถึงเป็น "ตัวอย่างของลักษณะ" ที่จะประพฤติอย่างถูกต้องเมื่อยกตัวอย่างเช่นเก็บไว้ในโครงสร้างข้อมูลที่มีมากมายหลายชนิดหนึ่งสามารถสร้างตัวชี้ไขมัน (instance_pointer, trait_vtable)
นี่คือความจริงทั่วไปของกลยุทธ์ข้างต้น