c++多态问题,当传入参数为派生类对象数组的时候……

donaroo 2006-06-13 11:42:07
c++多态问题,函数形参为基类指针,调用时传入派生类对象时候可以根据派生类对象的不同选择相应的派生类的函数,可当传入的参数为指向派生类对象数组的首地址的时候,若想在函数内部获取数组中每个对象该如何做?

写了个测试程序如下:
#include<iostream>
using namespace std;
class CBase
{
public:
CBase(){};
virtual void Fun()
{
cout<<"This is Base."<<endl;
}
};

class CA : public CBase
{
public:
CA(){};
void Fun()
{
cout<<"This is CA."<<endl;
}
private:
// int a;
};

void Func(CBase *pCB)
{
for(int i=0;i<10;i++)
pCB[i].Fun();
}


int main(int argc, char* argv[])
{
CA *pA=new CA[10];
// cout<<"size of CA ="<<sizeof(CA)
// <<" size of CBase ="<<sizeof(CBase)<<endl;
Func(pA);
return 0;
}

当CA类中的int a;被注释掉时,程序运行正常,如果不注释则出错,在调试的时候对照过内存地址,发现问题是在基类的指针+1之后尽管传入的参数是派生类对象的指针,但进行+1操作后内存地址依然是移动基类的size大小,所以会不能索引数组,只有当基类和派生类的size碰巧一样大的时候,才可以。


想问问各位高手这种情况用什么方法解决呢?
想过的解决方式:1 在调用此函数的地方用循环,在循环中调用,所以只需传对象不用传数组
2 在函数体内加入判断,对不同的派生类的对象强制将指针转换为该类的指针,但失去了多态的意义了

想不到什么好的解决办法,各位给点意见
...全文
275 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bing_huo 2006-06-14
  • 打赏
  • 举报
回复
貌似在哪看过 不要把多态用在对象数组上 会产生的问题不止上面表现出来的 因为cpp的数组 根本意义就是一个内存块 需要根据保存的数据类型来决定指针步进大小来访问数据的 但是 你参数的静态类型是基类 而实际传的是派生类 函数内部不知道派生类的存在 当然也就不知道派生类的大小 直接用访问 在派生类比基类大的时候(多数情况都是这样) 出错就是一种必然了

总之 这是一种错误的代码形式 要避免它出现在你的程序里
donaroo 2006-06-14
  • 打赏
  • 举报
回复
lyskyly(浮生三笑)

MAKE一下,要断点了

什么意思,不明白
晨星 2006-06-14
  • 打赏
  • 举报
回复
bing_huo(我是一个演员!) ( ) 信誉:100 2006-6-14 0:17:37 得分: 0

貌似在哪看过 不要把多态用在对象数组上 ……

==============
《More Effective C++》 -Item 3
lyskyly 2006-06-14
  • 打赏
  • 举报
回复
呵呵,要断点了打错字了,昨天要断电了,没时间写出来
yhmhappy2006(Nathan)的方法是个好方法,用10个指针来存10个CA对象就没有问题了,
昨天我想写的方法是在基类中再添加以个虚函数返回大小
void Func(CBase *pCB)
{
for(int i=0;i<10;i++)
{
((CBase*)((char*)pCB + i * pCB->Size()))->Fun();
}
}
塘外人 2006-06-14
  • 打赏
  • 举报
回复
我教你一个好方法,不要用数组
用vector,比如

void Func(vector<CBase*>& pvb)
{
for(int i=0;i<10;i++)
pvb[i].Fun();
}

vector<CBase*> vcb(10);
//....
Func(vcb);
lyskyly 2006-06-13
  • 打赏
  • 举报
回复
MAKE一下,要断点了

64,281

社区成员

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

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