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
。
Java-Socket服务端和多个客户端长连接
Socket 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。 短连接 服务端和客户端建立连接后,客户端获取流来和服务端通讯,通讯完毕后,关闭流,关闭Soc...
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++中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的( 封装 )特性。
《面向对象程序设计C++》期末试卷及答案.pdf
。


