• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Analiza kodu

Object Storage Arubacloud
0 głosów
538 wizyt
pytanie zadane 16 sierpnia 2016 w C i C++ przez Itan Początkujący (250 p.)

Witam,

mam problem z pewnym zadaniem:

"Załóż następujące definicje obiektów klas."
Kod:

#include <iostream>
 
using namespace std;
 
class A
{
protected:
    int a;
 
public:
    A(int aa):a(aa){};
    virtual int f(){return a+1;}
    int g(){return a-2;}
};
 
class B: public A
{
protected:
    int b;
 
public:
    B(int aa, int bb): A(aa)
    {
        this->b = bb;
    }
    virtual int f(){return a+b;}
    int g(){return a-b;}
};
 
int main()
{
    A a(3);
    B b(4,2);
    A *pa=&a;
    B *pb=&b;
    a=b;
    pa=pb;
 
    cout << a.f() << endl;
    cout << a.g() << endl;
    cout << b.f() << endl;
    cout << b.g() << endl;
    cout << pa->f() << endl;
    cout << pa->g() << endl;
    cout << pb->f() << endl;
    cout << pb->g() << endl;
 
    return 0;
}

 
Po kompilacji widzę wyniki, ale nie potrafię powiedzieć skąd się wzięły. Chciałbym to zrozumieć krok po kroku.
Widzę listę inicjalizacyjną, ale jestem dość świeży w temacie.

Pozdrawiam

1 odpowiedź

+3 głosów
odpowiedź 16 sierpnia 2016 przez criss Mędrzec (172,590 p.)
wybrane 16 sierpnia 2016 przez Itan
 
Najlepsza
a = b;

Musisz wiedzieć, że referencje (zmienne referencyjne) też podlegają zasadom polimorfizmu. Dlatego operator= (przypisania) (przyjmujący referencje na A) przyjmie też referencje na B. Jednak przypisanie b = a już nie było by możliwe. Podobnie jak B* bptr = &a; też by nie przeszło. Teraz a.a jest równe b.a (b.b zostało pominięte bo obiekt a nawet nie wiedział, że zostaje mu przypisany obiekt klasy B - w końcu dostał referencje na A (A&)).

pa = pb;

Wiadomo, polimorfizm dla wskaźników... Od teraz pa i pb wskazują na ten samo obiekt - b.

a.f() wywoła metode A::f() - wiadomo. Ale skoro został mu przpisany obiekt b, to a.a jest teraz równe 4. Wiec a.f() zwróci 5.

a.g() - podobnie. Zwróci 2.

Obiekt b został nietknięty, więc b.f() zwraca 4 + 2 i b.g() zwraca 4 - 2.

pa->f() Co prawda metoda f() jest wywoływana z pod wskaźnika na A, ale f() jest wirtualna i została przeciązona w klasie B, więc zostaje wywołana metoda B::f()

pa->g()   Metoda g() wirtualna już nie jest, więc skoro zostałe wywołana z pod wskaźnika na A, to wywołana zostaje metoda A::g()

pb->f() Tutaj już bez wątpliwości wywołana zostaje B::f()

pb->g() Podobnie tutaj zostaje wywołana B::g()

Mam nadzieje, że pomogłem :)

komentarz 16 sierpnia 2016 przez Itan Początkujący (250 p.)
Fantastycznie przeanalizowałeś ten kod, jestem ci bardzo wdzięczny. Wszystko teraz mogę zrozumieć :)

Dzięki wielkie

Podobne pytania

0 głosów
1 odpowiedź 693 wizyt
pytanie zadane 27 sierpnia 2016 w C i C++ przez Itan Początkujący (250 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 27 sierpnia 2016 w C i C++ przez Itan Początkujący (250 p.)
0 głosów
0 odpowiedzi 227 wizyt
pytanie zadane 26 marca 2017 w JavaScript przez marcinconn Obywatel (1,560 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...