Jika tidak ada pengiriman dinamis (polimorfisme), "metode" hanyalah fungsi yang manis, mungkin dengan parameter tambahan implisit. Dengan demikian, instance kelas tanpa perilaku polimorfik pada dasarnya adalah C struct
untuk keperluan pembuatan kode.
Untuk pengiriman dinamis klasik dalam sistem tipe statis, pada dasarnya ada satu strategi utama: vtables. Setiap instance mendapatkan satu pointer tambahan yang mengacu pada (representasi terbatas) tipenya, yang terpenting adalah vtable: Array pointer fungsi, satu per metode. Karena set lengkap metode untuk setiap jenis (dalam rantai pewarisan) diketahui pada waktu kompilasi, seseorang dapat menetapkan indeks berurutan (0..N untuk metode N) ke metode dan memanggil metode dengan mencari penunjuk fungsi di vtable menggunakan indeks ini (lagi melewati referensi instance sebagai parameter tambahan).
Untuk bahasa berbasis kelas yang lebih dinamis, biasanya kelas itu sendiri adalah objek kelas satu dan setiap objek sebaliknya memiliki referensi ke objek kelasnya. Objek kelas, pada gilirannya, memiliki metode dalam beberapa cara bergantung pada bahasa (di Ruby, metode adalah bagian inti dari model objek, dengan Python mereka hanya berfungsi sebagai objek dengan pembungkus kecil di sekitar mereka). Kelas-kelas biasanya menyimpan referensi ke superclass (es) mereka juga, dan mendelegasikan pencarian metode yang diwariskan ke kelas-kelas untuk membantu metaprogramming yang menambah dan mengubah metode.
Ada banyak sistem lain yang tidak didasarkan pada kelas, tetapi mereka berbeda secara signifikan, jadi saya hanya akan memilih satu alternatif desain yang menarik: Ketika Anda dapat menambahkan metode baru (set) ke semua jenis di mana saja di mana saja dalam program ini ( mis. ketik kelas di Haskell dan ciri-ciri di Rust), set lengkap metode tidak diketahui saat kompilasi. Untuk mengatasinya, kita membuat vtable per trait dan meneruskannya ketika implementasi trait diperlukan. Yaitu, kode seperti ini:
void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);
dikompilasi menjadi ini:
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);
Ini juga berarti informasi vtable tidak tertanam di objek. Jika Anda ingin referensi ke "instance of a trait" yang akan berperilaku benar ketika, misalnya, disimpan dalam struktur data yang berisi banyak jenis berbeda, orang dapat membuat penunjuk gemuk (instance_pointer, trait_vtable)
. Ini sebenarnya merupakan generalisasi dari strategi di atas.