Redian新闻
>
还请教一个关于C++的问题
avatar
还请教一个关于C++的问题# Programming - 葵花宝典
q*s
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
avatar
G*n
2
slicing

【在 q***s 的大作中提到】
: 做一个程序,一个父类(A),下面有几个子类(比如B),所有子类的实例都放在一个
: vector的集合中,集合中的对象当然都是父类型的了。但是我发现问题,如果从集合中
: 取出实例,这时就不能调用子类的override的函数了(比如tellMe)。下面是我的一个
: 测试程序,请各位指点一下:
: // main.cpp
: #include "A.h"
: #include "B.h"
: #include
: using namespace std;
: int main()

avatar
q*s
3
能给个详细的说明么,看不懂你这么说的.
我的问题是关键我不能事先知道是子类还是父类,即便是子类,也有多个.

【在 G****n 的大作中提到】
: slicing
avatar
p*o
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()

avatar
t*t
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()

avatar
q*s
6
谢谢!
果真呢!!!
为什么保存对象本身不行呢?

【在 p****o 的大作中提到】
: store pointers instead of objects in a vector. there is also memory
: leak in ur code.

avatar
q*s
7
一句话惊醒梦中人
你的解释太有帮助了
谢谢!

【在 t****t 的大作中提到】
: 三个典型错误:
: 1. virtual函数,父子类之间的缺省参数值应该相同。换句话说,缺省参数值不是
: dynamic bind的。
: 2. 数组不能和继承一起用,即数组里元素类型必须完全相同,就算是父子类也不行。
: 3. 你指望op=能把A变成B?
: A* a1=new B; // a指向一个B
: A a2=*a1; // a2永远是个A,不会这样就变成B的

avatar
q*g
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的

avatar
q*s
9
thanks a lot for all your help
avatar
h*i
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的

avatar
h*i
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.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。