Dinamik bir gönderme (polimorfizm) yoksa, "yöntemler" sadece şekerli işlevlerdir, belki de örtük bir ek parametreyle birlikte. Buna göre, polimorfik davranışı olmayan sınıfların örnekleri esasen struct
kod üretimi amacıyla Cs'dir.
Statik tip bir sistemde klasik dinamik dağıtım için temel olarak bir baskın strateji vardır: vtables. Her örnek türüne (sınırlı bir temsili), en önemlisi vtable'a başvuran bir ek işaretçi alır : Her yöntem için bir tane olmak üzere bir işlev işaretçisi dizisi. Her tür (miras zincirinde) için tam yöntem kümesi derleme zamanında bilindiği için, yöntemlere ardışık indeksler (N yöntemleri için 0..N) atanabilir ve içindeki işlev işaretçisini arayarak yöntemleri çağırabilir. bu dizini kullanan vtable (yine örnek başvurusunu ek parametre olarak iletir).
Daha dinamik sınıf tabanlı diller için, genellikle sınıfların kendileri birinci sınıf nesnelerdir ve her nesnenin kendi sınıf nesnesine bir başvurusu vardır. Sınıf nesnesi, sırayla, yöntemlere dile bağlı bir şekilde sahiptir (Ruby'de, yöntemler nesne modelinin temel bir parçasıdır, Python'da sadece etraflarında küçük paketlere sahip işlev nesneleri). Sınıflar tipik olarak üst sınıf (lar) ına referansları da saklar ve miras alınan metotların araştırılmasını metot ekleyen ve değiştiren meta programlamaya yardımcı olmak için bu sınıflara devreder.
Sınıflara dayanmayan birçok sistem var, ancak önemli ölçüde farklılar, bu yüzden sadece ilginç bir tasarım alternatifi seçeceğim: Programın herhangi bir yerinde tüm türlere yeni (set) yöntemler ekleyebildiğinizde ( örneğin Haskell'deki sınıflar ve Rust'taki özellikler), derleme sırasında yöntemlerin tamamı bilinmemektedir. Bu sorunu çözmek için, özellik başına bir vtable oluşturur ve özellik uygulaması gerektiğinde bunları iletir . Yani, kod şöyle:
void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);
şu şekilde derlenir:
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);
Bu ayrıca, vtable bilgilerinin nesneye gömülmediği anlamına gelir. Örneğin, birçok farklı tür içeren veri yapılarında saklandığında doğru davranacak bir "özelliğin örneğine" başvurmak istiyorsanız, bir yağ işaretçisi oluşturulabilir (instance_pointer, trait_vtable)
. Bu aslında yukarıdaki stratejinin genelleştirilmesidir.