2013-11-15 27 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; 
} 
相关问题