Si dovrebbe essere in grado di utilizzare funzioni di accesso pubblici e mutators:
Derived& Derived::operator=(const Derived& rhs)
{
if (&rhs != this)
SetColour(rhs.GetColour());
return *this;
}
Altrimenti rendere i membri protetti della classe base in modo che le classi derivate hanno accesso:
Derived& Derived::operator=(const Derived& rhs)
{
if (&rhs != this)
colour = rhs.colour;
return *this;
}
una terza opzione potrebbe essere quella di definire un pubblico operatore di assegnazione nella classe di base e avere la vostra chiamata classe derivata l'operatore di base:
Derived& Derived::operator=(const Derived& rhs)
{
if (&rhs != this)
Base::operator=(rhs);
return *this;
}
Ecco un banco di prova completa:
#define TEST 2
class Base
{
public:
Base() : m_protected(0), m_private(0) {}
Base(int pro, int pri) : m_protected(pro), m_private(pri) {}
~Base() {}
#if TEST == 1
Base& operator=(const Base& rhs)
{
if (this != &rhs)
{
m_protected = rhs.m_protected;
m_private = rhs.m_private;
}
return *this;
}
#elif TEST == 2
void SetPrivate(int i) { m_private = i; }
int GetPrivate() const { return m_private; }
#endif
protected:
int m_protected;
private:
int m_private;
};
class Derived : public Base
{
public:
Derived() : Base() {}
Derived(int pro, int pri) : Base(pro, pri) {}
#if TEST == 1
Derived& operator=(const Derived& rhs)
{
Base::operator=(rhs);
return *this;
}
#elif TEST == 2
Derived& operator=(const Derived& rhs)
{
if (this != &rhs)
{
SetPrivate(rhs.GetPrivate());
m_protected = rhs.m_protected;
}
return *this;
}
#endif
};
int main()
{
Derived a;
Derived b(10, 5);
a = b;
return 0;
}
Sei sicuro? il mio compilatore non mi permette di accedere a nulla dalla classe base, pubblico o altro. – SirYakalot
non dice alcuna istanza delle corrispondenze di argomento sovraccarico (che non è vero) e dice anche che l'oggetto ha qualificatori di tipo che impediscono una corrispondenza. Cosa significa? – SirYakalot
Tutti questi funzionano se si utilizzano metodi di ereditarietà pubblica e non const. Puoi mostrare più delle tue definizioni di classe e uso forse? – AJG85