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

[C++] rozszerzenie metody

Ostatnio zmodyfikowano 2013-03-06 19:24
Autor Wiadomość
forest
Temat założony przez niniejszego użytkownika
[C++] rozszerzenie metody
» 2013-03-05 23:40:13
Mam klase A i klase po niej dziedziczaca B. W klasie a jest funkcja dodawanie zwracająca inta. Chciałbym ją tak zmodyfikować aby wyglądało to mniej więcej tak ale nie mogę sobie poradzić...

C/C++
class A {
public:
   
    int dodaj() {
       
        return 9;
    };
   
};

i

C/C++
Class B: public A {
   
    int dodaj() {
       
        int a;
        a = dodaj();
       
        return( a + 10 );
       
    };
   
   
};

Z tego co zauważyłem kompilator wywołuje funkcje z klasy B zamiast wywołać ją z A i dodać 10. Wynik powinien się równać 19... Ewentualnie może ktoś mi powie co mam wklepać w googl żeby coś na ten temat znaleźć.. Wielkie dzięki za pomoc 
P-77774
Monika90
» 2013-03-05 23:51:38
C/C++
a = A::dodaj();
Z tym że redefinicja niewirtualnej funkcji składowej, to dziwny pomysł.
P-77776
forest
Temat założony przez niniejszego użytkownika
» 2013-03-06 00:00:12
Działa! Super wielkie dzięki? Czemu to dziwny pomysł jeśli możesz coś więcej powiedzieć na ten temat? Jeśli nie użyje wirtualnej metody to może się to wysypać? Nie do końca wiem o co chodzi w tych wirtualnych metodach...
P-77780
Monika90
» 2013-03-06 00:44:04
Obiektów klasy potomnej (B) mozna używać poprzez wskaźniki do klasy bazowej (A). (Jest to główna przyczyna, dla której się używa dziedziczenia.) Kiedy metoda nie jest wirtualna, to możesz dostać różne wyniki zależnie od tego czy odwołujesz się przez wskaźnik typu A*, czy B*. To jest dziwne, jeden i ten sam obiekt, a dwa różne zachowania.
C/C++
int main()
{
    B * b = new B;
    cout << b->dodaj() << endl; //19
    A * a = b;
    cout << a->dodaj() << endl; //9
    delete b;
}
Jakby dodaj() było wirtualne, to by było 19 w obydwu przypadkach.

Co na ten temat ma do powiedzenia Marshall Cline:
http://www.parashift.com/c++-faq/redefining-nonvirtuals.html

A najlepiej przeczytać w całości:
http://www.parashift.com/c++-faq/index.html
P-77781
forest
Temat założony przez niniejszego użytkownika
» 2013-03-06 14:43:57
Teraz mam troche inny problem mam klase A i dziedziczącą po niej klase B. Teraz chciałbym w klasie A wywołać funkcje z klasy B. Jak to zrobić? np

C/C++
class A {
public:
   
    int pracuj() {
       
        ilerazy();
       
        return 100;
    };
   
};

i

C/C++
class B
    : public A
{
   
    B::B {
       
        a = 0;
       
    };
   
    void ilerazy() {
       
        a++;
       
    };

Niestety B::odejmij już nie działa... Generalnie chodzi o to żeby zliczać ile razy ktoś pracował... 
P-77795
unimator
» 2013-03-06 15:28:29
Nie da się bo klasa bazowa nie wie nic o klasie pochodnej.
P-77802
Monika90
» 2013-03-06 19:24:59
No własnie, klasa bazowa nic nie wie o swoich pochodnych. Ale są sposoby by wiedziała, np. wzorzec projektowy Template Method http://pl.wikipedia.org/wiki/Metoda_szablonowa_%28wzorzec_projektowy%29

Czyli w klasie A deklarujesz funkcję wirtualną:
C/C++
class A
{
public:
    int pracuj() { ilerazy(); return 100; }
private:
    virtual void ilerazy() = 0;
};
a w klasie B ją definiujesz:
C/C++
class B
    : public A
{
private:
    void ilerazy() override { /* ... */ }
};
P-77830
« 1 »
  Strona 1 z 1