2009-01-20 47 views
3

當使用的std ::的for_each,上在C++中的多態方法使用std ::的for_each

class A; 
vector<A*> VectorOfAPointers; 

std::for_each(VectorOfAPointers.begin(), VectorOfAPointers.end(), std::mem_fun(&A::foo)); 

如果我們有類從A繼承和實施FOO(),並且我們保持指針的至A的矢量, 有什麼辦法可以調用foo()的多態調用,而不是顯式調用A :: foo()? 注意:我不能使用boost,只有標準的STL。

感謝, 加

回答

11

它實際上以這種方式工作。

#include <algorithm> 
#include <iostream> 
#include <functional> 
#include <vector> 

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

int main() 
{ 
    std::vector<A*> VectorOfAPointers; 
    VectorOfAPointers.push_back(new B()); 
    std::for_each(VectorOfAPointers.begin(), VectorOfAPointers.end(), std::mem_fun(&A::foo)); 
    return 0; 
} 

打印

B::foo() 

那麼它正是你想要的。檢查virtual關鍵字是否存在,但很容易忘記它們。

相關問題