C++中基类数组无法使用多态的原因是什么
发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,C++中基类数组无法使用多态的原因是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原因:数组的分配是采用:首地址+偏移量的方式,
千家信息网最后更新 2025年02月22日C++中基类数组无法使用多态的原因是什么
C++中基类数组无法使用多态的原因是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
原因:
数组的分配是采用:首地址+偏移量的方式,而偏移量是固定大小的,例如:Node arry[10];
arry[i] 的地址:&arry[0]+i*sizeof(Node);
当Node是含有虚函数的基类的时候,arry[]中保存的都是基类Node的元素,因为数组的取值方式便是固定偏移量的,一旦数组中存储的是继承类的话,那么这个数组的取值方式,会导致出现不可见的错误。(备注:通常情况下会认为这个元素是基类)。
例子:
#include
using namespace std;
class Base {
public:
virtual void f();
virtual void print();
};
void Base::f() {
cout<<"Base f() ."<
}
void Base::print() {
cout<< "Base print() ."<
}
class Derive :public Base{
public:
virtual void f();
};
void Derive::f() {
cout<<"Derive f() ."<
}
int main() {
Base a[5]; // 这里存储的是基类的数组
Derive d;
a[1] = d; // a[1]赋值 给继承类
for(int i = 0; i <5; i++){
a[i].f();//这里都会当走基类来处理
}
Base* b[2] = {NULL,NULL}; // 存储的是基类指针,指针的大小是固定的
b[0] = new Base();
b[1] = new Derive();
for(int i = 0; i <2; i++){
if (b[i] != NULL) {
b[i]->f();// 这里会输出 继承类的内容
delete b[i];
}
}
return 0;
}
Output:
Base f() .
Base f() .// a[0].f()
Base f() .
Base f() .
Base f() .
Base f() . // b[0]->f()
Derive f() . // b[1]->f()
输出结果分析:
1.通过上面的输出,可以看出一旦数组是基类,就算数组中的元素赋值为继承类,也是被当作基类来使用。
2.非要在数组中使用多态的话,可以采用指针的方式,指针的偏移量是固定的,可以使继承类的多态得到实现。
关于C++中基类数组无法使用多态的原因是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
数组
多态
指针
方式
偏移
原因
元素
问题
存储
输出
C++
中基
内容
地址
大小
更多
分析
帮助
解答
易行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电脑虚拟机安装软路由服务器
fq服务器是什么
网络安全宣传片国家电网
数据库中常用的数学模型有哪些
食物识别软件开发
上海国际网络安全
天津ftp服务器托管
医院网络安全内部审核表
如何修复个人信息数据库
计算机网络技术要考计算机二级么
网络安全性的一般性指标
与网络技术有关的书
类似共享汽车软件开发
邯郸网络安全知识答题
战地5都有哪些服务器
开机启动到网络安全模式
软件开发公司的软件服务费
网络安全交易体会
网络安全人才需求量
泰安网络安全保护案例
雅瑞服务器
搜航网科技互联网
软件开发公司社会调查
浪潮服务器关不了
云计算和网络技术专业哪个好
零基础数据库教程013期
杭州银行软件开发岗笔试
妇幼网络安全自查报告
没有备案服务器
数据库能处理死锁吗