2012-08-28 59 views
0

假設我們有一個類靜態成員函數調用的語義虛函數時

class Abstract { 
    Abstract(void); 
    virtual ~Abstract(void) = 0; 

    virtual void VirtualFunction(void) = 0; 

    static void CallsVirtual(void) { 
     VirtualFunction(); 
    } 
}; 
class Concrete : public Abstract { 
    Concrete(void) {} 
    ~Concrete(void){} 
    virtual void VirtualFunction(void) {/* Do virtual function-y stuff */} 
}; 

int main(void) { 
    Concrete _concrete; 
    Abstract& _abstractReference = _concrete; 

    _abstractReference.callsvirtual(); 
} 

哪個虛成員函數當一個基類的靜態成員函數通過基類指針調用派生類中被調用?

回答

4

都沒有。你會得到一個編譯器錯誤。您不能通過調用非static方法或通過static方法訪問非static成員。

//... 
virtual void VirtualFunction(void) = 0; 

static void CallsVirtual(void) { 
    VirtualFunction(); // Nope! 
} 
//... 
+0

這是我所期望的,因爲靜態成員函數沒有這個指針 –

+1

你可以在靜態函數中訪問非靜態成員。但是你需要一個明確的對象來做到這一點。 –

+0

所以如果CallsVirtual把一個基類指針作爲參數,我想我可以規避它,例如CallsVirtual(Abstract&that){that.VirtualFunction; }但是這使得它首先使它靜止=) –

0

通過使用this指針調用非靜態成員函數。 this指針隱式傳遞給每個成員函數。
但是,對於static成員函數,this指針根本不傳遞。因此,您無法通過靜態成員函數調用非靜態成員函數。

相關問題