Aşağıdaki C++ programı ile ilgili olarak:Türetilmiş ve temel sınıflar arasında işaretçi-işaretçi dönüşümü?
class Base { };
class Child : public Base { };
int main()
{
// Normal: using child as base is allowed
Child *c = new Child();
Base *b = c;
// Double pointers: apparently can't use Child** as Base**
Child **cc = &c;
Base **bb = cc;
return 0;
}
GCC son atamada aşağıdaki hatayı üretir:
error: invalid conversion from ‘Child**’ to ‘Base**’
Sorum şu iki bölümden oluşmaktadır:
- Neden dolaylı yok Çocuk ** 'dan Base **' ye dönüştürme?
- Bu örneği C stili bir döküm veya
reinterpret_cast
ile çalışabilirim. Bu kalıpları kullanmak, tüm tip güvenliği ortadan kaldırmak demektir. Bu işaretçilerin örtük olarak yayınlanması için sınıf tanımlarına ekleyebileceğim veya en azından dönüştürmeyi yerinestatic_cast
kullanmama izin verecek şekilde bir şey var mı?
Birçok programlama dilinde bu sorudaki varyasyonlar, SO hakkındaki en yaygın sorulardan biridir. Ancak herkes aynı dil için bile biraz farklı ifade eder, bu nedenle çiftleri bulmak zor olabilir. –
Gölgeli atmalardan kaçınmak için bu örneği "düzeltme", neden ilk etapta bir işaretçi-işaretçiyi kullandığınıza bağlı olacaktır. – aschepler