2013-11-15 60 views
0

這是示例代碼我有:函數,它在C語言的基類指針++一個重載用一個指向子類

#include <iostream> 
#include <vector> 
#include <string> 

class Animal { 

}; 

class Rabbit : public Animal { 

}; 

class Caller { 
    public: 
    virtual void call(Animal* a) { 
     std::cout << "Caller calls animal" << std::endl; 
    } 

    virtual void call(Rabbit* r) { 
     std::cout << "Caller calls rabbit" << std::endl; 
    } 
}; 


int main(int argc, char** argv) { 
    std::vector<Animal*> v; 
    Caller c; 
    auto a = new Animal(); 
    auto r = new Rabbit(); 
    v.push_back(a); 
    v.push_back(r); 


    for(auto elem : v) { 
     c.call(elem); 
    } 


    return 0; 
} 

此代碼的輸出可以在這裏找到

http://ideone.com/I29g3A

它輸出:

Caller calls animal 
Caller calls animal 

我想知道,withou t鑄造一個具體的元素Rabbit*,有沒有辦法讓call(Rabbit *r)方法得到調用?

+1

不,但您爲什麼需要爲派生類型調用不同的方法?這打破了多態的目的。 – juanchopanza

+0

無關,但您的程序正在泄漏內存。這個例子你不需要'new',只需要使用'Animal a;'和'v.push_back(&a)'。 –

+0

@juanchopanza我試圖實現訪問者模式。訪問者已經重載了它需要訪問的不同類型訪問的定義。 –

回答

3

當然,例如,通過跳過您的多態類系統中的合適訪問者。但是,我認爲您需要使用兩個名稱,而不是call()。我使用pubCall()call()

#include <iostream> 
#include <vector> 
#include <string> 

class Visitor; 

class Animal { 
public: 
    virtual void visit(Visitor&); 
}; 

class Rabbit : public Animal { 
    void visit(Visitor&); 
}; 

class Visitor 
{ 
public: 
    virtual void call(Animal* a) = 0; 
    virtual void call(Rabbit* r) = 0; 
}; 

void Animal::visit(Visitor& v) { 
    v.call(this); 
} 

void Rabbit::visit(Visitor& v) { 
    v.call(this); 
} 

class Caller 
    : Visitor { 
public: 
    void pubCall(Animal* a) { a->visit(*this); } 

private: 
    virtual void call(Animal* a) { 
     std::cout << "Caller calls animal" << std::endl; 
    } 

    virtual void call(Rabbit* r) { 
     std::cout << "Caller calls rabbit" << std::endl; 
    } 
}; 


int main(int argc, char** argv) { 
    std::vector<Animal*> v; 
    Caller c; 
    auto a = new Animal(); 
    auto r = new Rabbit(); 
    v.push_back(a); 
    v.push_back(r); 


    for(auto elem : v) { 
     c.pubCall(elem); 
    } 


    return 0; 
} 
相關問題