2013-05-15 403 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(){...}