class child:pulic base
{
pulic:
...
private:
...
};
int main()
{
vector<base> baseVec;
child cChild1, cChild2;
baseVec.push_back(cChild);
现在如何将baseVec的对象赋给cChild2?
}
11 个解决方案
#1
知道对象切割吗? 你的方法办不到。不建议使用类型转换,请正确使用动态机制。
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();
}
#2
UP
#3
vector<base>是错误的,应该vector<base*>,数组应用于多态只能用指针,因为基类和派生类大小不同,而数组的元素要求相同大小
#4
C++ more effective中有介绍 数组应用于多态的问题及解决办法
#5
如果base类中没有do方法而派生类中有此方法呢?
#6
你将一个子类对象push到vector<base>中,这个子类对象会被切割成基类对象。。你再取出来时也是一个基类对象。。
#7
有必要的话,可以用重量级的 vector<boost::any>
#8
貌似还是用 基类指针或者引用 的好,没有必要用那么复杂的东西
#9
用指针吧。
std::vector<base *> pBaseVec;
std::vector<base *> pBaseVec;
#10
vector<shared_ptr<Base*> >vec;
指针+shared_ptr
指针+shared_ptr
#11
感谢大家的解答,问题最终解决,利用vector<boost::any>
#1
知道对象切割吗? 你的方法办不到。不建议使用类型转换,请正确使用动态机制。
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();
}
#2
UP
#3
vector<base>是错误的,应该vector<base*>,数组应用于多态只能用指针,因为基类和派生类大小不同,而数组的元素要求相同大小
#4
C++ more effective中有介绍 数组应用于多态的问题及解决办法
#5
如果base类中没有do方法而派生类中有此方法呢?
#6
你将一个子类对象push到vector<base>中,这个子类对象会被切割成基类对象。。你再取出来时也是一个基类对象。。
#7
有必要的话,可以用重量级的 vector<boost::any>
#8
貌似还是用 基类指针或者引用 的好,没有必要用那么复杂的东西
#9
用指针吧。
std::vector<base *> pBaseVec;
std::vector<base *> pBaseVec;
#10
vector<shared_ptr<Base*> >vec;
指针+shared_ptr
指针+shared_ptr
#11
感谢大家的解答,问题最终解决,利用vector<boost::any>