我是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,那么如何实现静态成员函数的动态绑定。
答案 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方法设为虚拟(就像区域方法一样)。这符合你的目的。