Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Pomoć oko zadatka (objekti i instance, polimorfizam)

  • 2 odgovora
  • 3.364 pregleda

Najnovija ↓

Pomoć oko zadatka (objekti i instance, polimorfizam) 15.09.2013. u 13:12 · pre 159 meseci #1
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;
Re: Pomoć oko zadatka (objekti i instance, polimorfizam) 16.09.2013. u 12:30 · pre 159 meseci #2
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
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme