2011-07-19 32 views

cevap

3

ikili uyumluluğu ürününün bakımını yapmak ne demektir?

nesne düzeni aynı olacaktır, ancak bir tanımı kuralı noktası ikili uyumluluk temelde yararsız olduğu tüm kod, yeniden derlemek sürece ihlal ediyor olacak. Yeniden derleme olmadan, ODR bozulur ve çalıştığı durumda da çalışmayabilir.

Özellikle sınıftaki tüm sanal yöntemler ya saf ya da satır içi olarak tanımlanmışsa, derleyici başlığını içeren her bir çeviri biriminde vtable'ı oluşturabilir ve onu zayıf bir sembol olarak işaretleyebilir. Daha sonra bağlayıcı, bunlardan birini seçecek ve diğerlerini de atacaktır. Bu durumda, bağlayıcı tüm vtables tamamen aynı olduğunu doğrulamak için ve rastgele (ya da tanımlanmamış bir şekilde deterministik olarak) birini seçecek ve bu yöntemin tamamen sanal olduğu bir vtable seçmek için gerekli değildir. yöntem, sınıfın bir nesnesinin nesnesinde çağrılırsa, uygulamanın çökmesine neden olabilir.

+0

Benim durumumda, tüm sanal yöntemler saf değil, bir karışım var. Yine de belirsizlikle yaşamak yerine herşeyi yeniden inşa edeceğimi düşünüyorum. –

+0

Özellikle N paylaşımlı kütüphanelerim vardı.Ben sadece sanal fonksiyonu ilk lib içindeki bir temel sınıf işaretçisi ile arıyorum; diğer N-1 lib'leri, bu işlevin yeniden gerçekleştirilmesiyle türetilmiş sınıflar içerir. Safı saf olmayan bir şekilde değiştirmeyi ve sadece ilk kütüphaneyi yeniden derlemeyi planlamıştım. –

4

Eğer virtual saf virtual geçiş ve kodu yeniden derleme yaparken hiçbir uyumluluk sorunları yoktur. (Ancak, saf virtual için virtual sorunlara neden olabilir.)

kendine iyi bak gereken tek şey, olmayan saf virtual yöntemlerin bir gövdesi gerektiğini söyledi. Hiçbir şekilde uygulanamazlar. yani bunu kullanmasanız dahi eğer, bağlayıcı hataya neden olur

virtual int foo(); 

class A { 
public: 
    virtual int foo() 
    { 
    return 0; //put some content 
    } 
}; 

Sadece gibi koyamazsınız.

+0

Bu gerçekten güvenli değildir, bu ODR'nin ihlalidir (farklı çeviri birimleri aynı tür için farklı tanımlara sahiptir) ve bazı durumlarda sorunlara neden olabilir. –

+0

@David, örnek verebilir misiniz? – iammilind

+0

Sanırım verdiğim cevapta sağladım ama basitleştirmeye çalışacağım. Tüm sanal yöntemler ya saf sanal ya da sınıf tanımında satır içi olarak tanımlanmışsa, vtable'ı oluşturan tek bir çeviri birimi değil, bu başlığı içeren tüm çeviriler yoktur. Vtable zayıf bir sembol olarak işaretlenir ve linker rastgele * birini seçer. Eğer (bu çeviri birimi için saf değil) sanal işlevini çağıran temel sınıfa bağlı olan bir kodunuz varsa ve linker bu işlevin saf olduğu bir vtable seçtiyse ... –