[ HB_BHF @ 15.09.2013. 12:12 ] @
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;
[ Mihajlo Cvetanović @ 16.09.2013. 11:30 ] @
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
[ HB_BHF @ 16.09.2013. 21:55 ] @
Aha.. Znači poziva se jedna te ista funkcija preko dva različita pokazivača.

Hvala puno