Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

static member functions inheritance

I am new to C++ programming, i have a got doubt while doing some C++ programs, that is how to achieve dynamic binding for static member function. dynamic binding of normal member functions can be achieved by declaring member functions as virtual but we can't declare static member functions as virtual so please help me. and please see the below example:

#include <iostream>
#include <windows.h>
using namespace std;

class ClassA
{
     protected :
     int width, height;
     public:
     void set(int x, int y)
     {
       width = x, height = y;
     }
     static void print()
     {
       cout << "base class static function" << endl;
     }
     virtual int area()
     {
       return 0;
      }
};

class ClassB : public ClassA
{
     public:
   static void print()
   {
    cout << "derived class static function" << endl;
   }
   int area()
   {
    return (width * height);
   }
};

int main()
{
  ClassA *ptr = NULL;
  ClassB obj;
  ptr = &obj ;
  ptr->set(10, 20);
  cout << ptr->area() << endl;
  ptr->print();
  return 0;
}

In the above code i have assigned Derived class object to a pointer and calling the static member function print() but it is calling the Base class Function so how can i achieve dynamic bind for static member function.

like image 733
nagaradderKantesh Avatar asked May 15 '13 05:05

nagaradderKantesh


People also ask

Are static member functions inherited in C++?

Yes. It's inherited because it's a class member.

Why we Cannot inherit static members in Java?

Another thing to note is that you cannot override a static method, you can have your sub class declare a static method with the same signature, but its behavior may be different than what you'd expect. This is probably the reason why it is not considered inherited.


1 Answers

The dynamic binding that you want is a non-static behavior.

Dynamic binding is binding based on the this pointer, and static functions by definition don't need or require a this pointer.

Assuming that you need the function to be static in other situations (it doesn't need to be static in your example) you can wrap the static function in a non-static function.

class ClassA
{
     // (the rest of this class is unchanged...)

     virtual void dynamic_print()
     {
         ClassA::print();
     }
};

class ClassB : public ClassA
{
     // (the rest of this class is unchanged...)

     virtual void dynamic_print()
     {
         ClassB::print();
     }
};
like image 166
Drew Dormann Avatar answered Nov 24 '22 01:11

Drew Dormann