olmayan bir sanal temel sınıf kapsayan bir durum düşünün: Bu benim Konuya dair bulabildiğim ne B
ve C
'dan aldığı ve her ikisi de A
alt nesnesine sahip olduğu için iki A
alt nesnesine sahiptir.
Üye değişkenlere yönelik işaretçiler, genellikle nesnenin başlangıcından tamsayı sapması olarak uygulanır. Bu durumda, A
nesnesindeki int a
için tamsayı sapması sıfırdır. Yani "int a
türünde A
" işaretçisi, sıfırın bir tamsayı ofseti olabilir.
a "tipi
A
ait
int a
işaretçiyi" Bir dönüştürmek için "tip
B
ait
int a
için pointer," sen sadece
B
bulunan
A
altnesnesi (ilk
A
subobject) ofset bir tamsayı gerekir.
a "tipi
A
ait
int a
işaretçiyi" Bir dönüştürmek için "tip
C
ait
int a
için pointer," sen sadece
C
bulunan
A
altnesnesi (ikinci
A
subobject) ofset bir tamsayı gerekir.
B
ve
C
A
göre nerede derleyici bildiğinden
, derleyici A
den B
veya C
için downcast konusunda yeterli bilgiye sahiptir.
Şimdi sanal bir temel sınıf ile ilgili bir durum düşünün:
struct A { int a; }
struct B : virtual public A { int b; }
struct C : virtual public A { int c; }
struct D : public B, public C { int d; }
Olası bellek düzeni:
+-------------+
| B: ptr to A | ---+
| int b; | |
+-------------+ |
| C: ptr to A | ---+
| int c; | |
+-------------+ |
| D: int d; | |
+-------------+ |
| A: int a; | <--+
+-------------+
Sanal taban sınıfları genellikle (neredeyse A
türetmek) B
ve C
alarak uygulanmaktadır Tek A
subjobject için bir işaretçi içerir. A
alt nesnesinin işaretçileri gereklidir, çünkü B
ve C
'a göre A
konumu sabit değildir.
elimizde olan bir olsaydı "tip A
ait int a
için işaretçi," Biz değişebilir B
ve C
subobjects yeri beri, "tip B
ait int a
için pointer" Bir için döküm mümkün olmayacaktır A
'a göre. A
, B
ya da için geri bildirim göstermez; bu nedenle, aşağı çalışan yayın için yeterli bilgiye sahip değiliz.
+1 – Bill