往vector push_back了一个派生类对象,现在如何从这个vector中取出这个派生类对象?

时间:2021-10-20 19:59:34
class base{};
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


引用 1 楼 mujiok2003 的回复:
知道对象切割吗? 你的方法办不到。不建议使用类型转换,请正确使用动态机制。 

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();
}


UP

#3


vector<base>是错误的,应该vector<base*>,数组应用于多态只能用指针,因为基类和派生类大小不同,而数组的元素要求相同大小

#4


C++ more effective中有介绍 数组应用于多态的问题及解决办法

#5


引用 楼主 dangercheng 的回复:
class base{};
class child:pulic base
{
pulic:
...
private:
...
};

int main()
{
vector<base> baseVec;
child cChild1, cChild2;
baseVec.push_back(cChild);
现在如何将baseVec的对象赋给cChild2?
}

如果base类中没有do方法而派生类中有此方法呢?

#6


你将一个子类对象push到vector<base>中,这个子类对象会被切割成基类对象。。你再取出来时也是一个基类对象。。

#7


有必要的话,可以用重量级的 vector<boost::any> 

#8


貌似还是用 基类指针或者引用 的好,没有必要用那么复杂的东西

#9


用指针吧。
std::vector<base *> pBaseVec;

#10


vector<shared_ptr<Base*> >vec;
指针+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


引用 1 楼 mujiok2003 的回复:
知道对象切割吗? 你的方法办不到。不建议使用类型转换,请正确使用动态机制。 

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();
}


UP

#3


vector<base>是错误的,应该vector<base*>,数组应用于多态只能用指针,因为基类和派生类大小不同,而数组的元素要求相同大小

#4


C++ more effective中有介绍 数组应用于多态的问题及解决办法

#5


引用 楼主 dangercheng 的回复:
class base{};
class child:pulic base
{
pulic:
...
private:
...
};

int main()
{
vector<base> baseVec;
child cChild1, cChild2;
baseVec.push_back(cChild);
现在如何将baseVec的对象赋给cChild2?
}

如果base类中没有do方法而派生类中有此方法呢?

#6


你将一个子类对象push到vector<base>中,这个子类对象会被切割成基类对象。。你再取出来时也是一个基类对象。。

#7


有必要的话,可以用重量级的 vector<boost::any> 

#8


貌似还是用 基类指针或者引用 的好,没有必要用那么复杂的东西

#9


用指针吧。
std::vector<base *> pBaseVec;

#10


vector<shared_ptr<Base*> >vec;
指针+shared_ptr

#11


感谢大家的解答,问题最终解决,利用vector<boost::any>