有没有办法让一个派生类的容器在检索时被识别为派生类而不是基类?

时间:2013-12-11 04:47:25

标签: c++

我希望从同一基类派生的类中拥有一个对象容器。看来,最好的方法是拥有一个指向基类的指针容器,并将它们指向派生类对象。但是,我想检索一个对象并将其传递给一个为派生类重载的全局函数:

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设为Base的一个虚拟成员函数(分别为A,B),这可行,但我想保持MyFunction全局(或者可能在一个单独的类中)。我对C ++很新,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Base中添加一个虚拟成员函数,该函数对每个派生类的实现方式不同。

如果在Base中感觉不对,可能会添加一个派生自Base的中间类,AB从中派生出来。

更一般地说,这个问题的解决方案不是在每个呼叫者站点进行向下转换,而是通过访问者模式将这种向下转发集中在类本身中,但对于手头的情况,使用访问者模式似乎太沉重了 - 解决方案:只需要一个普通的虚拟功能。

相关问题