繁体   English   中英

静态成员函数继承

[英]static member functions inheritance

我是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()但它调用了基类函数,那么如何实现静态成员函数的动态绑定。

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

动态绑定是基于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();
     }
};

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

所以假设你修复了静态问题。

virtual void print(){...}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM