Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya. Bu güvenlik içindir.
işaretçiyi yukarıdan aşağıya doğru atarsak, yani. ebeveyne, bundan sonra işaretçiyi başka bir kapsamda iş parçacığına geçireceğiz, sonra alt alanlar orada mevcut olacak mı?
Комбинатор : Renat, dynamic_cast'in ne olduğunu biliyor musun?
Kesinlikle.
MQL5 kodunun tartışılan parçasına bir göz atın. Temel bir örnek oluşturulur ve ardından kahramanca, güvenlik sistemini ihlal ederek, oyuncu kadrosu aracılığıyla bir soyundan gelene dönüşmeye çalışır. Eh, elbette bir serseri.
Doğrudan belgelerde aynı örnek dikkate alınır ve açıklanır. Çalışma zamanında dinamik yayın, yalnızca güvenlik ve doğrulama denetimlerini geçtikten sonra tetiklenir. Her MQL5 nesnesi, çalışma zamanında izinleri kontrol etmek için tüm meta bilgilere sahiptir. Boş C++ değil.
dynamic_cast operatörüyle dinamik tip döküm
Sadece sınıf işaretçilerine uygulanabilen dynamic_cast operatörünü kullanarak dinamik tip döküm olasılığı vardır. Bu durumda, program yürütülürken türlerin doğruluğu kontrol edilir. Bu, dynamic_cast operatörünü kullanırken, derleyicinin, döküm için kullanılan veri türünü kontrol etmediği anlamına gelir. Bir işaretçi, nesnenin gerçek türü olmayan bir veri türüne dönüştürülüyorsa, sonuç NULL olur.
dynamic_cast<type-id> ( ifade )
Köşeli parantez içindeki type-id parametresi , önceden tanımlanmış bir sınıf tipine işaretçi olmalıdır. İşlenen türüifadesi(C++'dan farklı olarak) void dışında herhangi bir şey olabilir.
Misal:
sınıfCBar { }; sınıfCFoo :genelCBar { }; geçersizAçılışta() { CBar çubuğu; //--- *bar işaretçi türünün *foo işaretçisine dinamik olarak aktarılmasına izin verilir CFoo *foo =dynamic_cast<CFoo *>(&bar);// kritik çalışma zamanı hatası oluşmayacak yazdır(foo);// foo=NULL //--- Bar türündeki bir nesnenin referansını açıkça Foo türündeki bir nesneye dönüştürmeye çalışmak yasaktır foo=(CFoo*)&bar;// kritik bir çalışma zamanı hatası oluşacak yazdır(foo);// bu satır yürütülmeyecek }
çalışma zamanı hatası nedir
Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya. Bu güvenlik içindir.
C ++ ile karşılaştırmak imkansızdır - oradaki herhangi bir şeye her şey getirilebilir.
C++'da bu, yalnızca temel sınıfın işaretçisi bir çocuğu işaret ediyorsa mümkündür.
Bununla ne demek istediğini anlamadım, ama bu kod:
Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya. Bu güvenlik içindir.
C ++ ile karşılaştırmak imkansızdır - oradaki herhangi bir şeye her şey getirilebilir.
şimdi anladım açıklama için teşekkürler :)
Bununla ne demek istediğini anlamadım, ama bu kod:
Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya.
Temel sınıftan torunlara kadar sonuç almak imkansız mı?
Evet, gerçekten inşa edilmiş bir çocuğun tabanda yatmaması durumunda.
Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya. Bu güvenlik içindir.
Evet.
Renat, dynamic_cast'in ne olduğunu biliyor musun?
Kesinlikle.
MQL5 kodunun tartışılan parçasına bir göz atın. Temel bir örnek oluşturulur ve ardından kahramanca, güvenlik sistemini ihlal ederek, oyuncu kadrosu aracılığıyla bir soyundan gelene dönüşmeye çalışır. Eh, elbette bir serseri.
Doğrudan belgelerde aynı örnek dikkate alınır ve açıklanır. Çalışma zamanında dinamik yayın, yalnızca güvenlik ve doğrulama denetimlerini geçtikten sonra tetiklenir. Her MQL5 nesnesi, çalışma zamanında izinleri kontrol etmek için tüm meta bilgilere sahiptir. Boş C++ değil.
dynamic_cast operatörüyle dinamik tip döküm
Sadece sınıf işaretçilerine uygulanabilen dynamic_cast operatörünü kullanarak dinamik tip döküm olasılığı vardır. Bu durumda, program yürütülürken türlerin doğruluğu kontrol edilir. Bu, dynamic_cast operatörünü kullanırken, derleyicinin, döküm için kullanılan veri türünü kontrol etmediği anlamına gelir. Bir işaretçi, nesnenin gerçek türü olmayan bir veri türüne dönüştürülüyorsa, sonuç NULL olur.
dynamic_cast <type-id> ( ifade )
Köşeli parantez içindeki type-id parametresi , önceden tanımlanmış bir sınıf tipine işaretçi olmalıdır. İşlenen türü ifadesi (C++'dan farklı olarak) void dışında herhangi bir şey olabilir.
Misal:
sınıf CBar { };
sınıf CFoo : genel CBar { };
geçersiz Açılışta ()
{
CBar çubuğu;
//--- *bar işaretçi türünün *foo işaretçisine dinamik olarak aktarılmasına izin verilir
CFoo *foo = dynamic_cast <CFoo *>(&bar); // kritik çalışma zamanı hatası oluşmayacak
yazdır (foo); // foo=NULL
//--- Bar türündeki bir nesnenin referansını açıkça Foo türündeki bir nesneye dönüştürmeye çalışmak yasaktır
foo=(CFoo*)&bar; // kritik bir çalışma zamanı hatası oluşacak
yazdır (foo); // bu satır yürütülmeyecek
}