我希望从同一基类派生的类中拥有一个对象容器。看来,最好的方法是拥有一个指向基类的指针容器,并将它们指向派生类对象。但是,我想检索一个对象并将其传递给一个为派生类重载的全局函数:
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 ++很新,所以非常感谢任何帮助。
答案 0 :(得分:1)
在Base
中添加一个虚拟成员函数,该函数对每个派生类的实现方式不同。
如果在Base
中感觉不对,可能会添加一个派生自Base
的中间类,A
和B
从中派生出来。
更一般地说,这个问题的解决方案不是在每个呼叫者站点进行向下转换,而是通过访问者模式将这种向下转发集中在类本身中,但对于手头的情况,使用访问者模式似乎太沉重了 - 解决方案:只需要一个普通的虚拟功能。