2013-12-11 57 views
0

我想有一个来自相同基类的类的对象的容器。看起来最好的方法是创建一个指向基类的指针容器,并将它们指向派生类对象。然而,我想要检索的对象并把它传递到被重载派生类全局函数:(RESP A,B)有没有办法让派生类的容器在检索时被识别为派生类而不是基类?

Class Base {}; 
Class A : public Base {}; 
Class B : public Base {}; 

double MyFunction(const A &a_object) {does things}; 
double MyFunction(const B &b_object) {does different things}; 

typedef boost::shared_ptr<Base> Ptr; 
typedef std::vector<Ptr> PtrContainer; 

int main() 
{ 
    PtrContainer MagicContainer; 

    //Fill MagicContainer with A's and B's 



    double result = MyFunction(*MagicContiner[0]); //Compiler can't resolve 
    //which MyFunction to use 
} 

我知道如果我提出的MyFunction基地虚拟成员函数这会工作,但我想保持全球MyFunction(或可能在一个单独的类)。我对C++很陌生,因此非常感谢任何帮助。

+1

你可以把专门的行为放在虚拟方法后面吗?试图将非方法函数耦合到这样的类是不好的设计,并且会导致代码维护性差。如果可以的话,你真的需要课堂中所有特定于类的行为。 –

回答

1

添加虚拟成员函数中Base,即不同地实现对于每个派生的类。

如果感觉不对有它Base,可能要添加自Base得到的中间体类,AB然后从派生。

更一般地说,解决这个问题的方法并不是在每个呼叫者站点下垂,而是通过访问者模式集中在类本身中向下转换,但对于使用访问者模式的情况,似乎也是一样重量级的解决方案:只是一个普通的虚拟功能可能会。