Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoć oko zadatka (objekti i instance, polimorfizam)

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomoć oko zadatka (objekti i instance, polimorfizam)

[ Pregleda: 2628 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

HB_BHF
Student

Član broj: 314565
Poruke: 8
*.pppoe17891.bih.net.ba.



Profil

icon Pomoć oko zadatka (objekti i instance, polimorfizam)15.09.2013. u 12:12 - pre 128 meseci
Imam sljedeće klase i main:
Code (cpp):
class X{
int a;
public:
virtual int getA(){ return this -> a;}
virtual void setA(int a){ this -> a = a;}
};


Code (cpp):
class Y : public X{
int a;
public:
int getA() { return this -> a;}
void setA(int a){ this -> a = a;}
};


Code (cpp):
#include <iostream>
#include "X.h"
#include "Y.h"
using namespace std;

int main()
{
    X *x = new Y();
    x -> setA(5);
    Y *y = (Y*) x;
    y -> setA(10);
    cout << x -> getA() << endl;
    cout << y -> getA() << endl;
}
 


Moje pitanje je.. Zbog čega je ispis 10 10? Može li mi neko pojasniti šta ustvari znači ovo X *x = new Y(); i Y *y = (Y*) x;
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pomoć oko zadatka (objekti i instance, polimorfizam)16.09.2013. u 11:30 - pre 128 meseci
Funkcije getA i setA su virtuelne. Y::setA nasleđuje X::setA. Posledica je da će se pozvati funkcija klase kojom je kreiran objekat (new Y()), a ne funkcija klase koja je tip promenljive (X *x). U tim funkcijama koristi se promenljiva članica 'a', ali svaka klasa koristi svoju verziju promenljive članice.

Code:
    X *x = new Y(); // kreira se objekat Y
    x -> setA(5); // poziva se Y::setA, jer je X::setA virtuelna funkcija, pa je po automatizmu i Y::setA. Članica Y::a dobija vrednost 5. Članica X::a ostaje neinicijalizovana
    Y *y = (Y*) x; // promenljiva y (klase Y) pokazuje na isto ono na šta pokazuje promelnjiva x. Pošto promenljiva x i tako pokazuje na objekat Y neće bit problema
    y -> setA(10); // ponovo se poziva Y::setA. Članica Y::a dobija vrednost 10. Članica X::a ostaje neinicijalizovana
    cout << x -> getA() << endl; // poziva se Y::getA, koji je kao i X::getA virtuelna funkcija. Funkcija vraća vrednost Y::a, to jest 10
    cout << y -> getA() << endl; // sve isto kao u prethodnoj liniji, opet 10
 
Odgovor na temu

HB_BHF
Student

Član broj: 314565
Poruke: 8
*.ob.dlp223.bih.net.ba.



Profil

icon Re: Pomoć oko zadatka (objekti i instance, polimorfizam)16.09.2013. u 21:55 - pre 128 meseci
Aha.. Znači poziva se jedna te ista funkcija preko dva različita pokazivača.

Hvala puno
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pomoć oko zadatka (objekti i instance, polimorfizam)

[ Pregleda: 2628 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.