双重指针在基于基类的派生类下的应用

首先我们要知道int* arr[n]是定义的全是int*类型的数组,也就是全是地址的数组,而不是为了得到数组的首地址,因为数组名本身代表首地址

而如果我们想定义一个动态数组一般可以使用int *arr=new int[n],这是一个动态开辟n个空间的数组,同理呢,上面的也就可以写成int** arr=new int*[n],就是动态分配n个地址的动态数组,也同理呢,定义Contact是一个普通类,那么Contact arr=new Contact[n]就是一个开辟了存放n个Contact类的数组,那么为什么要解释怎么去动态分配n个地址的动态数组呢,因为如果Contact是一个抽象类的话,Contact的内存大小就是不确定的,所以在内存上就是不连续的,就不能使用动态开辟存放n个Contact类的方法了。我们就要使用地址来解决问题了,无论是否要使用抽象类的数组,一般抽象类和指针是同时使用的,有抽象类就有指针。所以如果我们想要得到一个抽象类的数组的话就要使用指针数组的方法了,数组里面全是指向抽象类的指针,就解决了内存大小未知从而有错误的问题了。

Contact** m_EmpArray = new Contact * [n],这里的new Contact * [n]是动态开辟了存放n个抽象类的地址的数组,而用来接收的Contact** m_EmpArray,其中Contact*要与new Contact * [n]中的类型(Contact*)对应相同,m_EmpArray是数组名,因为右面是使用了new来开辟空间,而new返回的是地址所以就要再使用一个*。

Contact是一个抽象类,一般需要使用Contact* contact = NULL来声明一个名为 contact 的指针变量,并将其初始化为 NULL。Contact* 表示 contact 是一个指向 Contact 类型对象的指针。这意味着 contact 可以指向 Contact 类型的对象或其派生类的对象。

而如果使用基于抽象类的派生类的话,创建一个派生类对象就需要使用new运算符在堆上创建对象,这里的Friend是基于Contact的一个派生类

Contact* contact = NULL;
contact=new Friend(参数列表);//这段代码首先声明了一个 Contact* 类型的指针 contact,并将其初始化为 NULL。然后,通过 new 运算符为 contact 分配了一个 Friend 类型的对象。这样,contact 指针指向了一个 Friend 类型的对象,可以通过它来访问 Friend 类中定义的成员函数和数据成员。
contact->sendMessage();//使用基类指针来调用虚函数
newSpace[i]=contact;//将 contact 的值赋给 newSpace[i],意味着将 contact 指针所指向的对象的地址赋值给 newSpace[i]。这样,newSpace[i] 和 contact 指向了同一个对象,它们都可以用来访问该对象的成员函数和数据成员。

newSpace[i]=new Friend(参数列表);//直接在 newSpace[i] 中创建一个新的 Friend 类型对象,并将其地址赋值给 newSpace[i]。这样,newSpace[i] 将指向一个新创建的 Friend 类型对象,而与 contact 指向的对象无关。


如果派生类重写了基类的虚函数,那么通过基类指针或引用调用虚函数时,会根据对象的实际类型来确定调用的是基类的虚函数还是派生类的虚函数。这就是多态性的应用。
使用基类指针来指向派生类对象,并通过该指针调用虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值