[英]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.