q***s 发帖数: 2243 | 1 做一个程序,一个父类(A),下面有几个子类(比如B),所有子类的实例都放在一个
vector的集合中,集合中的对象当然都是父类型的了。但是我发现问题,如果从集合中
取出实例,这时就不能调用子类的override的函数了(比如tellMe)。下面是我的一个
测试程序,请各位指点一下:
// main.cpp
#include "A.h"
#include "B.h"
#include
using namespace std;
int main()
{
vector vec;
for(int i=0; i<10; i++)
{
A* a = new B();
a->tellMe();
vec.push_back(*a);
}
for(int i=0; i<10; i++)
{
((A)vec[i]).tellMe(i*8);
}
return 0;
}
====================
// A.h
#ifnd |
G****n 发帖数: 618 | 2 slicing
【在 q***s 的大作中提到】 : 做一个程序,一个父类(A),下面有几个子类(比如B),所有子类的实例都放在一个 : vector的集合中,集合中的对象当然都是父类型的了。但是我发现问题,如果从集合中 : 取出实例,这时就不能调用子类的override的函数了(比如tellMe)。下面是我的一个 : 测试程序,请各位指点一下: : // main.cpp : #include "A.h" : #include "B.h" : #include : using namespace std; : int main()
|
q***s 发帖数: 2243 | 3 能给个详细的说明么,看不懂你这么说的.
我的问题是关键我不能事先知道是子类还是父类,即便是子类,也有多个.
【在 G****n 的大作中提到】 : slicing
|
p****o 发帖数: 1340 | 4 store pointers instead of objects in a vector. there is also memory
leak in ur code.
【在 q***s 的大作中提到】 : 做一个程序,一个父类(A),下面有几个子类(比如B),所有子类的实例都放在一个 : vector的集合中,集合中的对象当然都是父类型的了。但是我发现问题,如果从集合中 : 取出实例,这时就不能调用子类的override的函数了(比如tellMe)。下面是我的一个 : 测试程序,请各位指点一下: : // main.cpp : #include "A.h" : #include "B.h" : #include : using namespace std; : int main()
|
t****t 发帖数: 6806 | 5 三个典型错误:
1. virtual函数,父子类之间的缺省参数值应该相同。换句话说,缺省参数值不是
dynamic bind的。
2. 数组不能和继承一起用,即数组里元素类型必须完全相同,就算是父子类也不行。
3. 你指望op=能把A变成B?
A* a1=new B; // a指向一个B
A a2=*a1; // a2永远是个A,不会这样就变成B的
【在 q***s 的大作中提到】 : 做一个程序,一个父类(A),下面有几个子类(比如B),所有子类的实例都放在一个 : vector的集合中,集合中的对象当然都是父类型的了。但是我发现问题,如果从集合中 : 取出实例,这时就不能调用子类的override的函数了(比如tellMe)。下面是我的一个 : 测试程序,请各位指点一下: : // main.cpp : #include "A.h" : #include "B.h" : #include : using namespace std; : int main()
|
q***s 发帖数: 2243 | 6 谢谢!
果真呢!!!
为什么保存对象本身不行呢?
【在 p****o 的大作中提到】 : store pointers instead of objects in a vector. there is also memory : leak in ur code.
|
q***s 发帖数: 2243 | 7 一句话惊醒梦中人
你的解释太有帮助了
谢谢!
【在 t****t 的大作中提到】 : 三个典型错误: : 1. virtual函数,父子类之间的缺省参数值应该相同。换句话说,缺省参数值不是 : dynamic bind的。 : 2. 数组不能和继承一起用,即数组里元素类型必须完全相同,就算是父子类也不行。 : 3. 你指望op=能把A变成B? : A* a1=new B; // a指向一个B : A a2=*a1; // a2永远是个A,不会这样就变成B的
|
q*****g 发帖数: 72 | 8 补充一下下:
always use "delete" when you have used "new".
vector will destroy the object(s) it contains, but can not "free"
the momory that you allocated on heap.
【在 t****t 的大作中提到】 : 三个典型错误: : 1. virtual函数,父子类之间的缺省参数值应该相同。换句话说,缺省参数值不是 : dynamic bind的。 : 2. 数组不能和继承一起用,即数组里元素类型必须完全相同,就算是父子类也不行。 : 3. 你指望op=能把A变成B? : A* a1=new B; // a指向一个B : A a2=*a1; // a2永远是个A,不会这样就变成B的
|
q***s 发帖数: 2243 | 9 thanks a lot for all your help |
h***i 发帖数: 1970 | 10 数组元素可以用boost variant类型, 用boost::apply_visitor来调不同object的函数.
【在 t****t 的大作中提到】 : 三个典型错误: : 1. virtual函数,父子类之间的缺省参数值应该相同。换句话说,缺省参数值不是 : dynamic bind的。 : 2. 数组不能和继承一起用,即数组里元素类型必须完全相同,就算是父子类也不行。 : 3. 你指望op=能把A变成B? : A* a1=new B; // a指向一个B : A a2=*a1; // a2永远是个A,不会这样就变成B的
|
h***i 发帖数: 1970 | 11 do not use new, delete style, always use boost::shared_pointer.
【在 q*****g 的大作中提到】 : 补充一下下: : always use "delete" when you have used "new". : vector will destroy the object(s) it contains, but can not "free" : the momory that you allocated on heap.
|