class AbstractBaseClass
{
    public:

        virtual void DoAThing( const char* withThis ) {}
        virtual void DoAThing( const char* const* withThat ) = 0;

        AbstractBaseClass() {}
        virtual ~AbstractBaseClass() {}
};

class SomeMiddlewareClass : public AbstractBaseClass
{
    public:

        void ThisIsCool() {}

        SomeMiddlewareClass() {}
        virtual ~SomeMiddlewareClass() {}
};

class SomeEndClass : public SomeMiddlewareClass
{
    public:

        using SomeMiddlewareClass::DoAThing;
        void DoAThing( const char* const* withThat ) {}

        SomeEndClass() {}
        virtual ~SomeEndClass() {}
};

int main()
{
    SomeEndClass* myClass = new SomeEndClass();

    myClass->DoAThing( "withThis" );
    ((SomeMiddlewareClass*)myClass)->DoAThing( "withThisToo" );

    delete myClass;
}
