Radio sam sa clone() funkcijom za kopiranje polimorfnih klasa i tu mi je skoro sve jasno. Skoro sam citao neki clanak i tu je spomenuto da bi dobro dizajnirana apstraktna klasa trebala da ima PRIVATE copy constructor. Do sada sam uvek pravio copy constructor apstraktne klase kao public jer nisam mnogo brinuo o tome.
Evo koda pa da objasnim sta mi nije jasno.
Ovo lepo radi jedino sto protivreci dizajnu o kojem sam citao na nekoliko mesta ali nisam mogao da nadjem objasnjenje zasto spominju da treba biti private ( a ne protected ).
Jedino ako ne misle da treba da bude private u slucaju da abstract klasa nema podataka...?
Evo koda pa da objasnim sta mi nije jasno.
Code:
class Base
{
public:
Base() {}
virtual Base* clone() const = 0;
protected: // !!! Mora biti protected da bi derived klasa pristupila copy constructor-u bazne klase da bi se ceo objekat konstruisao
Base(const Base& rhs)
{
baseData = rhs.baseData;
}
private:
int baseData;
};
class Derived : public Base
{
public:
Derived(){}
Derived(const Derived& rhs)
: Base(rhs) // !!! Pozivanje baznog konstruktora
{
derivedData = rhs.derivedData;
}
Base* clone() const // !!! Kopiranje objekta
{
Base* pClone = new Derived(*this);
return pClone;
}
private:
int derivedData;
};
class Base
{
public:
Base() {}
virtual Base* clone() const = 0;
protected: // !!! Mora biti protected da bi derived klasa pristupila copy constructor-u bazne klase da bi se ceo objekat konstruisao
Base(const Base& rhs)
{
baseData = rhs.baseData;
}
private:
int baseData;
};
class Derived : public Base
{
public:
Derived(){}
Derived(const Derived& rhs)
: Base(rhs) // !!! Pozivanje baznog konstruktora
{
derivedData = rhs.derivedData;
}
Base* clone() const // !!! Kopiranje objekta
{
Base* pClone = new Derived(*this);
return pClone;
}
private:
int derivedData;
};
Ovo lepo radi jedino sto protivreci dizajnu o kojem sam citao na nekoliko mesta ali nisam mogao da nadjem objasnjenje zasto spominju da treba biti private ( a ne protected ).
Jedino ako ne misle da treba da bude private u slucaju da abstract klasa nema podataka...?
Potpis
EOF