#include <iostream>
#include <string>

struct Gun
{
    virtual void reload() { std::cout << "Gun::reload\n" ; }
};

struct Pistol : public Gun
{
    static const unsigned MagCap = 17 ;

    std::string slidePos ;
    unsigned roundsLeft ;
    
    Pistol( ) : slidePos("closed"), roundsLeft(MagCap) {}


    void reload()
    {
        std::cout << "Pistol::reload\n" ;

        if ( slidePos == "open" )
            roundsLeft = MagCap ;
        else
        {
            slidePos = "open" ;
            roundsLeft = MagCap+1 ;
        }
        slidePos = "closed" ;
    }
};

int main()
{
    Pistol p ;
    Gun g ;

    Gun* ptr = &p ;
    ptr->reload() ;

    ptr = &g ;
    ptr->reload() ;
}