8

我是 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;
}

在上面的代码中,我已经将派生类对象分配给一个指针并调用静态成员函数 print() 但它正在调用基类函数,所以我怎样才能实现静态成员函数的动态绑定。

4

4 回答 4

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();
     }
};
于 2013-05-15T05:47:35.150 回答
3

所以你有两个问题,第一个是你不能使用静态函数的继承。第二个是您缺少virtual告诉编译器该函数可以被子类覆盖的关键字。

因此,假设您解决了静态问题。

virtual void print(){...}
于 2013-05-15T05:47:14.433 回答
1

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

于 2013-05-15T05:44:56.873 回答
1

您不能将静态方法设为虚拟方法。只需将打印方法设为虚拟(就像区域方法一样)。它会达到你的目的。

于 2013-05-15T05:46:52.910 回答