静态成员函数继承

时间:2013-05-15 05:39:52

标签: c++ inheritance static-methods dynamic-binding

我是C ++编程的新手,我在做一些C ++程序时有疑问,就是如何实现静态成员函数的动态绑定。正常成员函数的动态绑定可以通过将成员函数声明为虚拟来实现,但我们不能将静态成员函数声明为虚拟,所以请帮助我。请看下面的例子:

#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;
}

在上面的代码中,我已经将Derived类对象分配给指针并调用静态成员函数print()但是它调用了Base类Function,那么如何实现静态成员函数的动态绑定。

4 个答案:

答案 0 :(得分:8)

您需要的动态绑定是非静态行为。

动态绑定是基于this指针的绑定,而static函数根据定义不需要或不需要this指针。

假设在其他情况下你需要函数是静态的(在你的例子中它不需要是静态的),你可以将静态函数包装在非静态函数中。

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();
     }
};

答案 1 :(得分:3)

所以这里有两个问题,第一个是你不能将继承与静态函数一起使用。第二个是你缺少关键字virtual来告诉编译器这个函数可以被子类重写。

假设您修复了静态问题。

virtual void print(){...}

答案 2 :(得分:1)

动态绑定没有多大意义,因为你甚至不需要一个对象来调用静态函数。

答案 3 :(得分:1)

您不能将静态方法设为虚拟方法。只需将print方法设为虚拟(就像区域方法一样)。这符合你的目的。