Why does implementation of abstract class not see overloaded pure virtual function?

abstract-class, c++, inheritance, pure-virtual

Solution

Your `SomeEndClass::DoAThing()` function not only overrides the function inherited from the base class, but also hides the other overloads of that function in the base class.

You could add a `using` declaration to your `SomeEndClass` class:

using SomeMiddlewareClass::DoAThing;

Therefore:

class SomeEndClass : public SomeMiddlewareClass
{
    public:

        using SomeMiddlewareClass::DoAThing;
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        void DoAThing( const char* const* withThat ) {}

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

With this fix, you can see your program compiling in this live example.

Problem

Given the following code example, why is the overloaded `AbstractBaseClass::DoAThing( const char* )` not visible as an inherited method in the `SomeEndClass` that implements the overloaded pure abstract `DoAThing( const char* const* )` method? ``` 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: void DoAThing( const char* const* withThat ) {} SomeEndClass() {} virtual ~SomeEndClass() {} }; void SomeFunction() { SomeEndClass* myClass = new SomeEndClass(); myClass->DoAThing( "withThis" ); ((SomeMiddlewareClass*)myClass)->DoAThing( "withThisToo" ); delete myClass; } ``` The compiler (and indexer) produce the following error on the `myClass->DoAThing( "withThis" );` line while the `((SomeMiddlewareClass*)myClass)->DoAThing( "withThisToo" );` line is accepted. Invalid arguments ' Candidates are: void DoAThing(const char * const *) no matching function for call to ‘SomeEndClass::DoAThing(const char [9])’ Shouldn't the `SomeEndClass` inherit the `AbstractBaseClass::DoAThing( const char* )` implementation? What am I doing wrong?

Original source