(一)问题描述
往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);
(new Child2());
c.push_back(obj);
for(auto i = (); i ! = (); ++i)
{
i->do();
}
参考文章:
C++ 对象切割(Object slicing )与虚拟函式 [大三TJB_708]_比较普通的程序员的博客-****博客
c++对象切割(Object Slicing)_xd1103121507的博客-****博客_c++ slicing
往vector push_back了一个派生类对象,现在如何从这个vector中取出这个派生类对象?-****论坛