2015-08-08 117 views
0

這是我的問題的最小例子。我有2個類,一個是抽象的,另一個是派生的。使靜態虛擬方法的實現。

#include <iostream> 

class A 
{ 
public: 
    virtual void foo() = 0; 
    void bar() { 
     foo(); 
     std::cout << "BAR" << std::endl; 
    } 
}; 

class B : public A 
{ 
public: 
    void foo() { 
     std::cout << "FOO" << std::endl; 
    } 
}; 

int main() 
{ 
    B b; 
    b.bar(); 
} 

代碼編譯並給出了預期的結果:FOO\nBAR。 現在回答這個問題:因爲foo - 類B的方法是完全獨立的(不使用變量或其他方法BA),所以我想foo變爲靜態。基本上我想用B::foo()foo聯繫。

聲明foo靜態不起作用,因爲foo實現從A虛方法。你如何處理這種情況?

+2

你想通過使函數靜態獲得什麼好處?爲什麼不把它保持原樣呢?另外,請看看:http://stackoverflow.com/questions/2721846/alternative-to-c-static-virtual-methods?rq=1 – dreamzor

+0

如果函數應該是靜態的,爲什麼它是虛擬的?如果它需要是虛擬的,[它顯然不能是靜態的](http://stackoverflow.com/q/1820477/3425536)。 – emlai

+0

@dreamzor這只是一個簡單的例子。我的實際類有很大的構造函數,我不想打電話。 – user38034

回答

3

您可以只需添加一個新的靜態方法,並有foo稱之爲:

class B : public A 
{ 
public: 
    void foo() { 
     doFoo(); 
    } 

    static void doFoo() { 
     std::cout << "FOO" << std::endl; 
    } 
}; 

這種方式,您也將能夠與B::doFoo()

0

未定義行爲來稱呼它,我想,但你可以試試這個:

((B*)nullptr)->B::foo(); 

通過調用->B::foo()代替->foo()我們跳過虛函數表查找,這是G因爲nullptr顯然沒有指向任何接近真實vtable的地方。

這對我有用,但沒有證明。未定義的行爲意味着如果您運行它,可能會刪除您計算機上的所有文件。所以不要真的使用它。