• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 206
  • Last Modified:

Why doesn't the compiler see overloaded base class functions?

Why doesn't the compiler see overloaded base class functions? I cannot explain why the follwing is an error:

    #include <string>
    #include <iostream>
    using namespace std;

    class Base
    {
      public:
        virtual void Do( const string& )
        {
          cout << "Base::Do( string )" << endl;
        }
        virtual void Do( const char* const data,
                                  const long length )
        {
          cout << "Base::Do( char*, long )" << endl;
        }
    };

    class Derived : public Base
    {
      public:
        virtual void Do( const int s )
        {
          cout << "Base::Do( int )" << endl;
        }
    };

    int main(int argc, char* argv[])
    {
      Derived d;
      d.Do( 5 );
      d.Do( string() );
      d.Do( "foobar", 6 );
      return 0;
    }

Why doesn't the compiler "see" the base class versions of Do()? The only way I can get this to compile is to qualify the calls by adding "Base::", like so:

    d.Base::Do( string() );
    d.Base::Do( "foobar", 6 );

Can someone explain to me why this is the case? Thanks!
0
magenta
Asked:
magenta
1 Solution
 
magentaAuthor Commented:
I should have pointed out that the compiler complains about the following lines:

     d.Do( string() );
     d.Do( "foobar", 6 );

It seems to only see the Derived methods.
0
 
thienpnguyenCommented:
In subclass, if you have a overload funtion that is same name with a fucntion in base class, then that function in base class will be hide .

0
 
thienpnguyenCommented:
For fixing the bug, you can do as following

class Derived : public Base
{
public:

    using  Base::Do; // <-------- new code

    virtual void Do( const int s )
    {
      cout << "Base::Do( int )" << endl;
    }

};

int main(int argc, char* argv[])
{
  Derived d;
  d.Do( 5 );
  d.Do( string() );
  d.Do( "foobar", 6 );
  return 0;
}
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
thienpnguyenCommented:
0
 
MDarlingCommented:
This is not meant to trample on thienpnguyen's answer.

Just thought I'd post the full listing as I got it to compile on M$ VC6.0.

Nice links Thien! Almost perfect for this question.




#include <string>
#include <iostream>
using namespace std;

class Base
{
public:
     virtual void Do( const string& )
     {
          cout << "Base::Do( string )" << endl;
     }
     virtual void Do( const char* const data,
          const long length )
     {
          cout << "Base::Do( char*, long )" << endl;
     }
};

class Derived : public Base
{
public:
     
     Base::Do;
     
     virtual void Do( const int s )
     {
          cout << "Base::Do( int )" << endl;
     }
};

int main(int argc, char* argv[])
{
     Derived d;
     d.Do( 5 );
     d.Do( string() );
     d.Do( "foobar", 6 );
     return 0;
}
0
 
magentaAuthor Commented:
Very intesting...I'm going to have to sit down and read that article. I should probably have the C++ standard nearby...

However, before I do that, answer this question. If a derived class by definition can be treated the same as a base class, then isn't the code above example of this rule being broken?
0
 
griesshCommented:
Dear magenta

I think you forgot this question. I will ask Community Support to close it unless you finalize it within 7 days. You can always request to keep this question open. But remember, experts can only help you if you provide feedback to their questions.
Unless there is objection or further activity,  I will suggest to accept

     "thienpnguyen"

comment(s) as an answer.
     "refund the points and delete this question"
since nobody had a satisfying answer for you.
since you never gave more feedback.
PAQ at zero points.

If you think your question was not answered at all, you can post a request in Community support (please include this link) to refund your points. The link to the Community Support area is: http://www.experts-exchange.com/commspt/


PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
======
Werner
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now