Przeciążona metoda nie wykonuje się.
Ostatnio zmodyfikowano 2015-11-12 10:35
RazzorFlame Temat założony przez niniejszego użytkownika |
Przeciążona metoda nie wykonuje się. » 2015-11-11 14:51:19 Witam, może to jakiś błahy i podstawowy błąd ale zastanawiam się dlaczego dzieje się tak, że ten kod: #include <iostream> using namespace std;
class Base { public: virtual void sth() { cout << "A" << endl; } Base() { sth(); } };
class Derived : public Base { public: void sth() { cout << "B" << endl; } Derived() : Base() { } };
int main() { cout << "Base says: "; Base base; cout << "Derived says: "; Derived derived; return 0; }
Wypisuje: Base says: A Derived says: A
Mimo, że metoda sth jest przeciążona. Aby uzyskać wg. mnie poprawny wynik musiałem w konstruktorze Derived wywołać jeszcze raz sth(); ale wtedy dostawałem wyświetlone oba komunikaty (A i B). Dlaczego wykonuje się tylko metoda klasy Base? EDIT: Dobra, znalazłem: http://www.artima.com/cppsource/nevercall.htmlNo dobra ale to nie da się tego jakoś obejść? Nie chce aby trzeba było w każdej klasie potomnej wszystkie funkcje wywoływać... EDIT x2: Przeczytałem troche o tym. Musze zrobić coś w stylu: class Base { public: Base() { } void Init() { } };
No nie spodziewałem się tego. Szkoda. |
|
j23 |
» 2015-11-11 19:08:03 Pamiętam, że kompilator Borlanda C++ buildera najpierw ustawiał vtable, a później wywoływał konstruktor klasy bazowej, dzięki czemu operacja, którą chciałeś wykonać była możliwa. |
|
michal11 |
» 2015-11-12 00:24:29 Wydaje mi się, że dzieje się tak ponieważ przy wywołaniu konstruktora Derived najpierw wykonuje się konstruktor Base w którym wywołujesz metodę sth ale nie na rzecz obiektu klasy Derived, bo ten na tym etapie nawet nie istnieje, a na tej części klasy Derived która jest typu Base dlatego dostajesz wywołanie tej funkcji z klasy Base. |
|
j23 |
» 2015-11-12 10:35:22 @michal11, poczytaj o vtable. |
|
« 1 » |