2013-05-15 250 views
7

我是新来的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; 
} 

在上面的代码中,我已指定派生类对象的指针和调用静态成员函数打印(),但它被调用基类功能,所以我怎样才能实现动态绑定静态成员函数。

回答

7

你想要的动态绑定是一种非静态行为。

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

不错!我喜欢。 –

1

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

1

您不能将静态方法设为虚拟。只需将打印方法设为虚拟(就像区域方法一样)。它会为你的目的服务。

3

所以你在这里有两个问题,第一个是你不能在静态函数中使用继承。第二个是你错过了关键字virtual告诉编译器这个函数可以被子类覆盖。

因此,假设你解决了静态问题。

virtual void print(){...}