Page 1 of 1

Obiect creat dinamic

Posted: 10 Feb 2018, 19:15
by david_stelian
In codul de mai jos am declarat mai intai un obiect obj cu durată de stocare automată, ceea ce înseamnă că acesta va fi distrus automat la ieșirea din domeniul în care este definit.
Prin intermediul acestui obiect am accesat metoda printValue();

Apoi am declarat un obiect *box cu o durată de stocare dinamică(un pointer), ceea ce înseamnă că nu va fi distrus până când nu este utilizaț în mod explicit cuvantul cheie delete.

As vrea sa accesez motoda printValue() similar ca in primul caz, insa nu am reusit si nici nu stiu daca se poate.
Astept sugestii.

Code: Select all

#include<iostream>
using namespace std;

class BaseClass
{
private:
    int x;
    int y;
public:
    BaseClass(int x, int y)
    {
        this->x = x;
        this->y = y;
        cout << "\n Called BaseClass() from BaseClass!" << endl;
    }
    virtual void myFunction()
    {
        cout << "\n Called myFunction() from BaseClass!" << endl;
    }
    int getX()
    {
        return x;
    }
    int getY()
    {
        return y;
    }
};

class DerivedClass:public BaseClass
{
private:
    int z;
public:
    DerivedClass(int z, int x, int y):BaseClass(x, y)
    {
        this->z = z;
        cout << "\n Called DerivedClass() from DerivedClass!" << endl;
    }
    void myFunction()
    {
        cout << "\n Called myFunction() from DerivedClass!" << endl;
    }
    void printValue(DerivedClass arr)
    {
        cout << "\n x = " << arr.getX() << endl;
        cout << "\n y = " << arr.getY() << endl;
        cout << "\n z = " << z << endl;
    }
};

int main()
{
    DerivedClass obj(300, 100, 200);
    BaseClass *box = &obj;
    box->myFunction();
    obj.printValue(obj);

    BaseClass *box = new DerivedClass(100, 200, 300);
    box->myFunction();
    return 0;
}

Re: Obiect creat dinamic

Posted: 10 Feb 2018, 20:34
by Viorel
Încearcă o conversie explicită:

Code: Select all

DerivedClass * d = (DerivedClass*)box;
d->printValue( *d );
Funcția printValue ar putea fi declarată virtuală în clasa de bază, iar parametrul arr ar putea fi eliminat deoarece există this. Funcția din BaseClass va tipări x și y, iar funcția din DerivedClass poate apela funcția din clasa de bază, apoi va afișa z.

(Mai există operatorii static_cast și dynamic_cast; ultimul poate fi folosit pentru a verifica disponibilitatea conversiei: http://www.codexpert.ro/forum/viewtopic.php?t=1829).

Re: Obiect creat dinamic

Posted: 11 Feb 2018, 20:39
by david_stelian
Multumesc de raspuns Viorel, dar am totusi o nelamurire.
Am declarat functia printValue virtuala in clasa de baza.
Codul arata in felul urmator:

Code: Select all

#include<iostream>
using namespace std;

class BaseClass
{
private:
    int x;
    int y;
public:
    BaseClass()
    {
        cout << "\n Called default BaseClass() from BaseClass!" << endl;
    }
    BaseClass(int x, int y)
    {
        this->x = x;
        this->y = y;
        cout << "\n Called BaseClass() from BaseClass!" << endl;
    }
    virtual void myFunction()
    {
        cout << "\n Called myFunction() from BaseClass!" << endl;
    }
    virtual void printValue()
    {
        cout << "\n x = " << x << endl;
        cout << "\n y = " << y << endl;
    }
};

class DerivedClass:public BaseClass
{
private:
    int z;
public:
    DerivedClass(int z, int x, int y):BaseClass(x, y)
    {
        this->z = z;
        cout << "\n Called DerivedClass() from DerivedClass!" << endl;
    }
    void myFunction()
    {
        cout << "\n Called myFunction() from DerivedClass!" << endl;
    }
    void printValue()
    {
        cout << "\n z = " << z << endl;
    }
};

int main()
{
    DerivedClass obj(300, 100, 200);
    BaseClass *box = &obj;
    box->printValue();
    return 0;
}

Imi este afisat doar z si e firesc sa fie afisat doar z, pana aici totul ok, dar nu inteleg cum Funcția din BaseClass va tipări x și y, iar funcția din DerivedClass poate apela funcția din clasa de bază, apoi va afișa z.
x si y nu imi sunt afisate.
Astept un reply.
Multumesc anticipat!

Re: Obiect creat dinamic

Posted: 11 Feb 2018, 20:59
by Viorel
Încearcă această funcție în DerivedClass:

Code: Select all

void printValue()
{
   BaseClass::printValue();
   cout << "\n z = " << z << endl;
}