关于c ++:静态成员函数继承

static member functions inheritance

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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(),但它调用的是基类函数,所以如何实现静态成员函数的动态绑定。


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

动态绑定是基于this指针进行的绑定,定义上的static函数不需要或不需要this指针。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
     }
};


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

所以假设你解决了静态问题。

1
virtual void print(){...}


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


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