Obiect creat dinamic

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
david_stelian
Junior
Junior
Posts: 19
Joined: 13 Sep 2014, 22:35
Judet: Dolj

Obiect creat dinamic

Post by david_stelian » 10 Feb 2018, 19:15

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;
}



Viorel
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 13 Jul 2007, 12:26

Re: Obiect creat dinamic

Post by Viorel » 10 Feb 2018, 20:34

Î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).

david_stelian
Junior
Junior
Posts: 19
Joined: 13 Sep 2014, 22:35
Judet: Dolj

Re: Obiect creat dinamic

Post by david_stelian » 11 Feb 2018, 20:39

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!

Viorel
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 13 Jul 2007, 12:26

Re: Obiect creat dinamic

Post by Viorel » 11 Feb 2018, 20:59

Încearcă această funcție în DerivedClass:

Code: Select all

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

Post Reply