把子类放入基类的vector里面。

lood339 2008-12-01 06:25:48
我现在想实现这样一个事情。在一个vector里面放入同时放入基类和子类。在调用的时候,利用虚拟的性质实现不同的方法。
Base b1;
Derive *d1 = new Derive;

vector<Base> baseVec;
vector<Base>::iterator iBase;

baseVec.push_back(b1);
baseVec.push_back(d1);

其中,Base是Derive的父类,但是出现了“error C2664: 'push_back' : cannot convert parameter 1 from 'class Derive *' to 'const class Base &'”的错误。请问,要实现这个功能,在c++里面需要对父类和子类如何定义呢?
就是要把子类放入父类的vector里面。
谢谢


...全文
1122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lood339 2008-12-05
  • 打赏
  • 举报
回复
谢谢楼上的各位,是要用指针才行,分析的也有理。分不多,意思意思了。
bfhtian 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lc19890326 的回复:]
你的vector是一般对象(vector <Base>),而你放入的是派生类指针(d1),当然没法转换啦

C/C++ code
Base b1;
Derive *d1 = new Derive;

vector<Base*> baseVec; //容器为基类指针
vector<Base*>::iterator iBase;

baseVec.push_back(&b1); //放入的也应该是指针或者地址
baseVec.push_back(d1);



最后一定要注意delete你容器的每一个指针,否则容易造成内存泄露
[/Quote]
up
cba_v 2008-12-02
  • 打赏
  • 举报
回复
up
luckyvan 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jicy_luo 的回复:]
在vector里面放基类的指针就可以了!
因为如果vector中存放的是基类的话,再把子类放到vector中的时候会发生截断,这样实际上vector中存放的就只是子类的基类部分了!
而放基类的指针就不存在这样的问题!
[/Quote]

up
这个回答是比较准确的

而且lz的编译器报错已经很说明问题了,何苦拿上来耽误大家的时间
kingteng 2008-12-01
  • 打赏
  • 举报
回复
up[Quote=引用 3 楼 lc19890326 的回复:]
你的vector是一般对象(vector <Base>),而你放入的是派生类指针(d1),当然没法转换啦

C/C++ code
Base b1;
Derive *d1 = new Derive;

vector<Base*> baseVec; //容器为基类指针
vector<Base*>::iterator iBase;

baseVec.push_back(&b1); //放入的也应该是指针或者地址
baseVec.push_back(d1);



最后一定要注意delete你容器的每一个指针,否则容易造成内存泄露
[/Quote]
luojc714 2008-12-01
  • 打赏
  • 举报
回复
在vector里面放基类的指针就可以了!
因为如果vector中存放的是基类的话,再把子类放到vector中的时候会发生截断,这样实际上vector中存放的就只是子类的基类部分了!
而放基类的指针就不存在这样的问题!
lann64 2008-12-01
  • 打赏
  • 举报
回复
想想也知道不可能放进去的。vector是连续内存的。换句话说,每个元素的大小创建时就固定了。
子类元素对象多半比基类的要大,这时候vector里是没位置放这样的元素的。即使可以转换类型放进去,那也是被裁剪了的对象(多半只是剩下子类中的基类部分),这个估计跟lz的要求完全是两样的。

要是用指针就不会出现这样的问题,因为不管是子类指针还是基类指针,他们的大小是一样的,而且因为多态,基类指针是可以指向子类对象的。这样无论是类型上还是大小上都没问题。
lc19890326 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 appearance 的回复:]
Base b1;
Derive *d1 = new Derive;

vector <Base> baseVec;
vector <Base>::iterator iBase;

baseVec.push_back(b1);
baseVec.push_back((Base*)d1);
[/Quote]
错 指针不能直接转换为对象
lc19890326 2008-12-01
  • 打赏
  • 举报
回复
你的vector是一般对象(vector<Base>),而你放入的是派生类指针(d1),当然没法转换啦

Base b1;
Derive *d1 = new Derive;

vector<Base*> baseVec; //容器为基类指针
vector<Base*>::iterator iBase;

baseVec.push_back(&b1); //放入的也应该是指针或者地址
baseVec.push_back(d1);

最后一定要注意delete你容器的每一个指针,否则容易造成内存泄露
Carmack Jiang 2008-12-01
  • 打赏
  • 举报
回复
Base b1;
Derive *d1 = new Derive;

vector<Base> baseVec;
vector<Base>::iterator iBase;

baseVec.push_back(b1);
baseVec.push_back((Base*)d1);
WingForce 2008-12-01
  • 打赏
  • 举报
回复
Base b1;
Derive *d1 = new Derive;

vector<Base*> baseVec;
vector<Base*>::iterator iBase;

baseVec.push_back(b1);
baseVec.push_back(d1);


用指针就好了

65,171

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧