Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

C++ Programming

Using protected methods within a derived class?


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.

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.

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.

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc