Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przeciążona metoda nie wykonuje się.

Ostatnio zmodyfikowano 2015-11-12 10:35
Autor Wiadomość
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:
C/C++
#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.html
No 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:
C/C++
class Base
{
public:
    Base()
    {
        // tutaj nie moge wirtualnych
    }
    void Init()
    {
        // a tutaj tak
    }
};
No nie spodziewałem się tego. Szkoda.
P-139929
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.
P-139954
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.
P-140013
j23
» 2015-11-12 10:35:22
@michal11, poczytaj o vtable.
P-140019
« 1 »
  Strona 1 z 1