2013-02-01 60 views
1

如果我有一個純虛函數,可以用函數指針重寫它嗎?以下方案(我知道,這不是100%語法正確):C++用函數指針覆蓋純虛函數

#include<iostream> 
using namespace std; 

class A { 
    public: 
     virtual void foo() = 0; 
}; 

class B : public A { 
    public: 
     B() { foo = &B::caseOne; } 
     void caseOne() { cout << "Hello One" << endl; } 
     void caseTwo() { cout << "Hello Two" << endl; } 
     void (B::*foo)(); 
     void chooseOne() { foo = &B::caseOne; } 
     void chooseTwo() { foo = &B::caseTwo; } 
}; 

int main() { 
    B b; 
    b.(*foo)(); 
} 

編輯:如果任何人的興趣,這裏就是我完成了我想做的事:

#include<iostream> 
using namespace std; 

class A { 
    public: 
     virtual void foo() = 0; 
}; 

class B : public A { 
    public: 
     B() { f = &B::caseOne; } 
     void caseOne() { cout << "Hello One" << endl; } 
     void caseTwo() { cout << "Hello Two" << endl; } 
     void (B::*f)(); 
     void chooseOne() { f = &B::caseOne; } 
     void chooseTwo() { f = &B::caseTwo; } 
     void foo() { (this->*f)(); } 
}; 

int main() { 
    B b; 
    b.foo(); 
    b.chooseTwo(); 
    b.foo(); 
} 

的輸出是:

Hello One 
Hello Two 

回答

3

不,你用錯了。在你的代碼中,你試圖將成員函數指針指定給函數指針 - 它不能被編譯。

C++ 03標準10.3/2

如果虛擬成員函數VF在類基地和派生的類聲明,直接或 從基地成員函數VF與衍生間接與Base :: vf相同的名稱和參數列表是 ,那麼Derived :: vf也是虛擬的(無論它是否如此聲明),並且它會覆蓋 Base :: vf。

+0

謝謝。我編輯了我的代碼以使用正確的(我認爲)語法,以防其他人遇到此問題。 – Eliezer

0

我覺得編譯時,語法不能編譯。您應該提供具有特定名稱和相同參數列表的覆蓋功能。

3

正如@ForEveR所說,你的代碼無法編譯。但是,因爲你真正需要的是在運行時切換B的實施foo的能力,我們有解決方法:

#include <iostream> 
using namespace std; 

class A { 
    public: 
     virtual void foo() = 0; 
}; 

class B : public A { 
    private: 
     void (B::*_f)(); 

    public: 
     B() { chooseOne(); } 

     void caseOne() { 
      cout << "case one" << endl; 
     } 

     void caseTwo() { 
      cout << "case two" << endl; 
     } 

     void chooseOne() { _f = &B::caseOne; } 

     void chooseTwo() { _f = &B::caseTwo; } 

     void foo() { 
      (this->*_f)(); 
     } 
}; 

int main(int argc, const char *argv[]) 
{ 
    A* b = new B(); 
    b->foo(); 
    ((B*)b)->chooseTwo(); 
    b->foo(); 
    return 0; 
} 

UPDATE

剛剛發現的OP增加了他的答案這個問題與我的幾乎一樣。但我認爲通過指針而不是實例對象調用foo比較好,因爲這可以表現出多態性的效果。此外,最好隱藏f作爲私人會員功能。