Αbominable Δημοσ. 24 Αυγούστου 2011 Δημοσ. 24 Αυγούστου 2011 Έχω 2 κλάσεις > class A { int a; void f(void) {do_something_on_a;} } class B : public A { int b; void f(void) {do_something_on_b;} } int main(void) { B bO; bO.f(); return 0; } Εάν τρέξω την B::f στην ουσία θα τρέξει την A::f (θα επεξεργαστεί το a). Εάν δηλώσω την A::f virtual τότε τρέχοντας την B::F θα τρέξει κανονικά (θα επεξεργαστεί το b ). Πως μπορώ να κάνω όταν καλώ την B::f να τρέξει και η B::F και η A::f (να επεξεργαστούν και το a και το b ); Αυτό που ζητάω γίνεται; Ευχαριστώ πολύ για όποια βοήθεια.
παπι Δημοσ. 24 Αυγούστου 2011 Δημοσ. 24 Αυγούστου 2011 > class Foo { public: void Bar() { std::cout<<"Foo::Bar\n"; } }; class Fee : public Foo { public: void Bar() { std::cout<<"Fee::Bar\n"; Foo::Bar(); } }; int main(int,char**) { Fee fee; fee.Bar(); return 0;}
Erevis Δημοσ. 24 Αυγούστου 2011 Δημοσ. 24 Αυγούστου 2011 Έχω 2 κλάσεις > class A { int a; void f(void) {do_something_on_a;} } class B : public A { int b; void f(void) {do_something_on_b;} } int main(void) { B bO; bO.f(); return 0; } Εάν τρέξω την B::f στην ουσία θα τρέξει την A::f (θα επεξεργαστεί το a). Εάν δηλώσω την A::f virtual τότε τρέχοντας την B::F θα τρέξει κανονικά (θα επεξεργαστεί το b ). Πως μπορώ να κάνω όταν καλώ την B::f να τρέξει και η B::F και η A::f (να επεξεργαστούν και το a και το b ); Αυτό που ζητάω γίνεται; Ευχαριστώ πολύ για όποια βοήθεια. Αυτό είναι λάθος. Αν καλείς την f χρησιμοποιώντας object της Β τότε θα κληθεί η Β::f. Aν καλείς την συνάρτηση χρησιμοποιώντας pointer σε object της Β τότε εξαρτάται από την κλάσση του pointer κι αν η f είναι virtual ή όχι. > #include <iostream> class A { public: void DoSomething() { std::cout << "I'm A \n"; } }; class B : public A { public: void DoSomething() { std::cout << "I'm B \n"; } }; int main(int argc, char **argv) { B b; b.DoSomething( ); return 0; } Σ'αυτή την περίπτωση θα εμφανιστεί "I'm B". > #include <iostream> int main(int argc, char **argv) { B b; B *pb = &b; pb->DoSomething( ); return 0; } Εδώ πάλι θα εμφανιστεί "I'm B". > #include <iostream> int main(int argc, char **argv) { B b; A *pa = &b; pa->DoSomething( ); return 0; } Eδώ τώρα επειδή η DoSomething δεν είναι virtual θα εμφανιστεί "I'm A". Άμα δηλώσεις όμως την A σαν virtual τότε θα κληθεί πάλι η B::DoSomething( ). Όσο για την ερώτηση που έκανες σε κάλυψε σωστότατα ο παπί.
Αbominable Δημοσ. 25 Αυγούστου 2011 Μέλος Δημοσ. 25 Αυγούστου 2011 Ευχαριστώ πολύ για την απάντηση. Είσασταν κατατοπιστικότατοι !!!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.