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(),但它调用的是基类函数,所以如何实现静态成员函数的动态绑定。
所需的动态绑定是非静态行为。
动态绑定是基于
假设您需要函数在其他情况下是静态的(在您的示例中不需要是静态的),您可以将静态函数包装为非静态函数。
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(); } }; |
所以这里有两个问题,第一个问题是不能将继承用于静态函数。第二个问题是缺少关键字
所以假设你解决了静态问题。
1 | virtual void print(){...} |
不能将静态方法设为虚拟方法。只需将打印方法设置为虚拟(就像区域方法一样)。这将符合你的目的。
动态绑定没有多大意义,因为您甚至不需要对象来调用静态函数。