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

donaroo donaroo 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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 在函数体内加入判断,对不同的派生类的对象强制将指针转换为该类的指针,但失去了多态的意义了

想不到什么好的解决办法,各位给点意见
...全文

相关推荐

C++期末复习试卷A.pdf

。

G11176593

Java-Socket服务端和多个客户端长连接

Socket 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。 短连接 服务端和客户端建立连接后,客户端获取流来和服务端通讯,通讯完毕后,关闭流,关闭Soc...

菜鸟特工007

python socket编程之tcp协议多客户端连接

1.socket 介绍:       socket 原意插座,插孔,计算机中一般称为套接字。 在同一台计算机中的两个程序可以通过文件,管道,队列等方式进行通信;但是在网络中,两台计算机之间的通讯就需要依靠socket进行通信。2.socket之tcp协议:        tcp 协议英文:Transmission Control Protocol,中文:传输控制协议,是tcp/ip 协议族的一种协...

西风吹老丹枫树

c++面向对象复习题答案版.doc

1.C++中有两种数据类型: ( char )和 ( int long )可以使用signed修饰符。 在C++中,用数组、指针、和( 引用 )作为函数参数,能够将参数值带回。 2.为了降低函数调用的时间开销,建议将小的调用频繁的函数定义为(内联函数 ),方法是在函数类型前加上(inline)关键字。 3.面向对象的程序设计有四大特征,它们是抽象、封装、( 继承 )、( 多态 )。 4.拷贝构造函数是在用一个对象初始化另一个对象时被调用,系统缺省的拷贝构造函数的工作方法是( 把对象的每个数据成员的值都复制到新建立的对象中)。 5.用new申请某一个类的动态对象数组时,在该类中必须能够匹配到(该类的)构造函数,否则应用程序会产生一个编译错误。 6.静态数据成员必须在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象( 共享 )。 7.在C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型( 不同 )。 8.在C++中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的( 封装 )特性。

作业写不完的卑微小cookie

《面向对象程序设计C++》期末试卷及答案.pdf

。

「已注销」
评论 6
收藏 已收藏
分享
返回顶部
donaroo
C++ 语言 65,214 成员 250,514 内容