παπι Δημοσ. 17 Νοεμβρίου 2013 Δημοσ. 17 Νοεμβρίου 2013 Εχουμε τουτο struct IPublicInterface { virtual void Func1() = 0; }; ////////////////////////// struct IInternalInterface: public IPublicInterface { virtual void Func2() = 0; }; ///////////////////////// struct InternalDispacher { virtual void Fire() { this->OnSomthing(); } virtual void OnSomthing() { } }; /////////////////////// struct SomeAbstract: public IInternalInterface, public InternalDispacher { //public interface imp virtual void Func1() { std::cout<<"SomeAbstract::Func1()"<<std::endl; } //internal interface imp virtual void Func2() { std::cout<<"SomeAbstract::Func2()"<<std::endl; } //dispacher override virtual void OnSomthing() override { std::cout<<"SomeAbstract::OnSomthing()"<<std::endl; } virtual void Foo() = 0; }; ////////////////////// struct JustAClass: public SomeAbstract { //override dispacher virtual void OnSomthing() override { std::cout<<"JustAClass::OnSomthing()"<<std::endl; } //imp abstract virtual void Foo() { } }; int main() { IPublicInterface *obj = new JustAClass; obj->Func1(); ((IInternalInterface*)obj)->Func2(); ((InternalDispacher*)obj)->Fire();//<---- ((SomeAbstract*)obj)->Fire(); ((JustAClass*)obj)->Fire(); return 0; } το αποτελεσμα Γιατι; Αφου το jsutaclass ειν απανω απο το internaldispacher.
bnvdarklord Δημοσ. 17 Νοεμβρίου 2013 Δημοσ. 17 Νοεμβρίου 2013 Μήπως καποιο C++11 feature που δεν υποστηριζει το VS? Σε g++ δεν εχω θεμα: http://i.imgur.com/HAQbKL3.png
arxangelos Δημοσ. 17 Νοεμβρίου 2013 Δημοσ. 17 Νοεμβρίου 2013 οντως και γω δεν εχω προβλημα, γτ δεν δοκιμαζεις σε g?
παπι Δημοσ. 17 Νοεμβρίου 2013 Μέλος Δημοσ. 17 Νοεμβρίου 2013 Μήπως καποιο C++11 feature που δεν υποστηριζει το VS? Σε g++ δεν εχω θεμα: http://i.imgur.com/HAQbKL3.png Αυτο ειναι λαθος αποτελεσμα. Το ((InternalDispacher*)obj)->Fire(); υποτιθεται οτι πρεπει να καλεσει την OnSomthing της JustAClass, αλα και σ'εσενα καλει την Func1 της someabstract
bnvdarklord Δημοσ. 17 Νοεμβρίου 2013 Δημοσ. 17 Νοεμβρίου 2013 Όντως. Εχεις μονο μια Fire, αρα θα επρεπε να μπει εκει μέσα, παρ'όλα αυτά αν βαλω ενα cout στην Fire δεν θα το τυπωσει στην 3η περιπτωση που εχεις το προβλημα.
defacer Δημοσ. 17 Νοεμβρίου 2013 Δημοσ. 17 Νοεμβρίου 2013 Ρε συ παπί εγώ δεν κατάλαβα τι πρέπει να δούμε στο screenshot...
παπι Δημοσ. 17 Νοεμβρίου 2013 Μέλος Δημοσ. 17 Νοεμβρίου 2013 Ρε συ παπί εγώ δεν κατάλαβα τι πρέπει να δούμε στο screenshot... Οτι η γραμμη 78 εχει ενα call που παει στο γαμο του καραγκιοζη. Καλω την Fire, και αντι να πει εκει, παει στην func1 Που δεν εχει καμια σχεση. Βασικα εχει σχεση, ειναι πρωτη στο vtable. εδιτ. Το βρηκα. Φταιει το static cast. Με dynamic δουλευει gg. Κοιτα να δεις τι μαθαινεις στα καλα καθουμενα, εγω νομιζα οτι τα *_cast ειναι απλα "checkers"... τελεικα δεν ειναι, το dynamic κανει και "manipulation" του vtable/pointer whateva int main() { IPublicInterface *obj = new JustAClass; SomeAbstract *abst = dynamic_cast<SomeAbstract*>( obj );//ok abst->Fire();//ok InternalDispacher *disp = dynamic_cast<InternalDispacher*>( abst );//ok disp->Fire();//ok InternalDispacher *disp1 = dynamic_cast<InternalDispacher*> ( obj ); disp1->Fire(); InternalDispacher *disp2 = (InternalDispacher*) ( obj );//ok disp2->Fire();//fail if(disp2 != disp1) { std::cout<<"To idio reference, me diaforetiko reference :P"; } /* obj->Func1(); ((IInternalInterface*)obj)->Func2(); ((InternalDispacher*)obj)->Fire();//<---- ((SomeAbstract*)obj)->Fire(); ((JustAClass*)obj)->Fire(); */ return 0; } 1
dop Δημοσ. 22 Νοεμβρίου 2013 Δημοσ. 22 Νοεμβρίου 2013 Γιατί χρησιμοποιείς ακόμα C-style casts; Τα C-style casts μπορεί να καταλήξουν να κάνουν reinterpret_cast μερικές φορές (και οι κανόνες δεν είναι οι πιο καθαροί πότε γίνεται αυτό).
παπι Δημοσ. 22 Νοεμβρίου 2013 Μέλος Δημοσ. 22 Νοεμβρίου 2013 Τα c++ cast εχουν πολλα συμβολα. Επισης δεν ηξερα οτι επιδρουν στον δεικτη
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα