Çok sayıda gönderi okudum ve herkesin söylediğine göre, sanal tablo nesne başına değil, nesne ve nesnenin yalnızca paylaşılan vtable için _vtpr işaretçisi var. Ama bu örneği düşünün lütfen:Polimorfizmde sanal tablo
class Base
{
public:
virtual void func1(void) {}
virtual void func2(void) {}
private:
int dummy;
};
class Der1 : public Base
{
public:
virtual void func1(void) {}
private:
int dummy;
};
class Der2 : public Base
{
public:
virtual void func2(void) {}
private:
int dummy;
};
int main(void)
{
Base * obj1 = new Der1;
Base * obj2 = new Der2;
}
obj1 ve obj2 o bir benzersiz Taban sınıf vtable ile ilgilidir mu? Cevabın hayır olduğuna inanıyorum ama açıklayabilir misiniz? Ve eğer bu nesnelerin her ikisi de aynı vtable ile ilişkiliyse, hangi yöntemlerin çağrılması gerektiği nasıl belirlenir? Örneğin, obj1-> func1 başvurusu obj2-> func1'den farklıdır.
GÜNCELLEME: Base * obj1 = new Der1;
yaparken
ne gibi faaliyetleri yürütür? Birisi bu eylemler için bir sözde kod yazabilir mi?
. Derleyici uygulayıcılarının istediklerini yapmakta özgür oldukları anlamına gelir. Herhangi bir vtable olacağının bir garantisi bile yok. Bu, neden bir C++ ABI'mizin bulunmamasının en önemli nedenlerinden biridir. Bunu "diyor" diyen herkese söyle. – Drop
Muhtemelen 'Der1' ve' Der2' her birinin kendi vtable var, değil mi? –
Bu [cevap] (http://stackoverflow.com/a/562240/2352671) tarafından [Johannes Schaub - litb] (http://stackoverflow.com/users/34509/johannes-schaub-litb) – 101010