C++中基类数组无法使用多态的原因是什么
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,C++中基类数组无法使用多态的原因是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原因:数组的分配是采用:首地址+偏移量的方式,
千家信息网最后更新 2024年12月12日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安全错误
数据库的锁怎样保障安全
电子资源数据库厂家
连接服务器发送文件
四川网络安全前景
数据库 2012官网下载
陵英语听力软件开发
如何搭建一个ftp服务器
知网数据库管理规定
数据库连接池怎么删除
软件开发的成本怎么核算
宝塔服务器管理助手怎么样
古冶区信息网络技术不二之选
深圳鹏城科技互联网怎么样
16年双11数据库
涉密网络安全保密管理制度
软件开发项目中的质量管理
在哪个文件可以修改dns服务器
软件开发信息系统管理计划书
计算机网络技术需要技能
哪吒汽车软件开发怎么样
网络安全防范工作规定
数据库自连接
信息网络安全师是什么职称
多台主机怎么组装一个服务器
php5连接数据库错误
北京数据库安全箱销售
易语言多线程数据库
软件开发周报范文300字
立林人脸识别服务器账号密码
vingcard数据库还原
画图表示数据库连接池的工作原理