(一)问题描述
往vector<基类> push_back了一个派生类对象,现在如何从这个vector中取出这个派生类对象?并且可以使用派生类中的接口函数?
(二)解决方案
1.对象切割(Object slicing)
一般来说,衍生类所占的存储空间一般都比基础类大。当用基础类强制转换派生类物件(对象)指標时就会产生对象切割(Object slicing),即:当把一个派生类对象赋给一个基类对象时或者用基类对象强制转换派生类对象就会发生对象切割。
2.解决方案:多态的实现是通过指针和引用
struct Base { virtual void do() { std::cout << "Base" << std::endl; } }; struct Child1 : public Base { virtual void do() { std::cout << "Child1" << std::endl; } }; struct Child2 : public Base { virtual void do() { std::cout << "Child2" << std::endl; } }; std::vector<std::shared_ptr<Base>> c; std::shared_ptr<Base> obj(new Child1()); c.push_back(obj); obj.reset(new Child2()); c.push_back(obj); for(auto i = c.begin(); i ! = c.end(); ++i) { i->do(); }