Using protected methods within a derived class?

T

Tigera

This doesn't seem to make any sense to me.

I have three classes, the declarations of which are shown below:

class Action
{
public:
virtual void Act (int range, int elevation, Combatant* actor ) = 0;
virtual void React (Action* incoming, Combatant* actor ) = 0;
virtual string Name ( ) const = 0;
virtual bool CanAct (int range, int elevation, Combatant* actor ) =
0;
virtual void Act (int range, int elevation, Combatant* actor,
Target& target ) = 0;
virtual bool CanAct (int range, int elevation, Combatant* actor,
Target& target ) = 0;
virtual ~Action() = 0;
};

class AttackAction : public Action
{
protected:
virtual void CalculateSpecials (Score* attack, Score* defense ) =
0;
virtual void CalculateDamage (Score* attack, Score* defense ) = 0;
virtual void DoDamage (int attacker, int defender ) = 0;
virtual ~AttackAction() = 0;
};

class SpecialAttack : public AttackAction
{
public:
virtual void Act (int range, int elevation, Combatant* actor );
virtual void React (Action* incoming, Combatant* actor );
virtual string Name ( ) const;
virtual bool CanAct (int range, int elevation, Combatant* actor );
virtual void Act (int range, int elevation, Combatant* actor,
Target& target );
virtual bool CanAct (int range, int elevation, Combatant* actor,
Target& target );
virtual ~SpecialAttack();

protected:
AttackAction* m_decorated;

virtual void CalculateSpecials (Score* attack, Score* defense );
virtual void CalculateDamage (Score* attack, Score* defense );
virtual void DoDamage (int attacker, int defender );
};

Now, inside any of the protected methods of SpecialAttack, if I try
this:

m_decorated->CalculateSpecials(attack, defense);

The compiler spits back the error:
error: 'virtual void
Battle::AttackAction::CalculateDamage(Battle::Score*, Battle::Score*)'
is protected
specialattack.cpp:20: error: within this context

Is this something that I've done wrong, or is it a bug within the
compiler? It seems intuitively obvious to me that if any of those
methods are protected, I should be able to use them within a derived
class.

Thanks for your help.
 
R

Rolf Magnus

Tigera said:
This doesn't seem to make any sense to me.

I have three classes, the declarations of which are shown below:

class Action
{
public:
virtual void Act (int range, int elevation, Combatant* actor ) = 0;
virtual void React (Action* incoming, Combatant* actor ) = 0;
virtual string Name ( ) const = 0;
virtual bool CanAct (int range, int elevation, Combatant* actor ) =
0;
virtual void Act (int range, int elevation, Combatant* actor,
Target& target ) = 0;
virtual bool CanAct (int range, int elevation, Combatant* actor,
Target& target ) = 0;
virtual ~Action() = 0;
};

class AttackAction : public Action
{
protected:
virtual void CalculateSpecials (Score* attack, Score* defense ) =
0;
virtual void CalculateDamage (Score* attack, Score* defense ) = 0;
virtual void DoDamage (int attacker, int defender ) = 0;
virtual ~AttackAction() = 0;
};

class SpecialAttack : public AttackAction
{
public:
virtual void Act (int range, int elevation, Combatant* actor );
virtual void React (Action* incoming, Combatant* actor );
virtual string Name ( ) const;
virtual bool CanAct (int range, int elevation, Combatant* actor );
virtual void Act (int range, int elevation, Combatant* actor,
Target& target );
virtual bool CanAct (int range, int elevation, Combatant* actor,
Target& target );
virtual ~SpecialAttack();

protected:
AttackAction* m_decorated;

virtual void CalculateSpecials (Score* attack, Score* defense );
virtual void CalculateDamage (Score* attack, Score* defense );
virtual void DoDamage (int attacker, int defender );
};

Now, inside any of the protected methods of SpecialAttack, if I try
this:

m_decorated->CalculateSpecials(attack, defense);

The compiler spits back the error:
error: 'virtual void
Battle::AttackAction::CalculateDamage(Battle::Score*, Battle::Score*)'
is protected
specialattack.cpp:20: error: within this context

Is this something that I've done wrong, or is it a bug within the
compiler?

The former.
It seems intuitively obvious to me that if any of those
methods are protected, I should be able to use them within a derived
class.

You can, but only on the same object.
 
A

Archie

Now, inside any of the protected methods of SpecialAttack, if I try
this:

m_decorated->CalculateSpecials(attack, defense);

The compiler spits back the error:
error: 'virtual void
Battle::AttackAction::CalculateDamage(Battle::Score*, Battle::Score*)'
is protected
specialattack.cpp:20: error: within this context

Is this something that I've done wrong, or is it a bug within the
compiler? It seems intuitively obvious to me that if any of those
methods are protected, I should be able to use them within a derived
class.

The protected members of any class can be accessed by friends of the
class or pointer/reference to the class derived from it. Although you
have derived publicly from class AttackAction but you are invoking it
from a pointer to AttackAction. What you are trying to do is akin to
this

class A
{
protected:
int i;
};

A* ptr;
ptr->i; //not allowed as i is protected.

Try invoking CalculateSpecials directly from within SpecialAttack
(which will eventually result in this->CalculateSpecials ) and it
should compile fine.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,240
Members
46,830
Latest member
HeleneMull

Latest Threads

Top