条款3:绝对不要以多态方式处理数组

从零开始安装pytorch(包含GPU和CPU版本的安装) Pytorch是。 阅读详情

**
印象笔记:
C++允许通过base class的pointers和references来操作“derived class objects所形成的数组”。但它几乎绝不会如你所预期般地运作。
**

继承的最重要性质之一是:你可以通过“指向base class objects”的pointers或references,来操作derived class objects。
如:

Shape *shape;
Rectangle rec(10,7);
Triangle  tri(10,5);

// 存储矩形的地址
shape = &rec;

// 存储三角形的地址
shape = &tri;

由于derived classes通常比其base classes有更多的data members,所以derived class objects通常都比base class objects来得大。

因此考虑如下:
//class BalancedBST:public BST{};

void printBSTArray(ostream& s,const BST array[],int numElements)
{
    for(int i=0;i<numElements;++i{
        s<<array[i];
    }
}

我们知道array[i]代表的其实是*(array+i),array所指内存和array+i所指内存两者相距i*sizeof(数组中的对象)。
当通过BalancedBST对象所组成的数组交给printBSTArray函数时

BalancedBST bBSTArray[10];
printBSTArray(cout,bBSTArray,10);

你的编译器会毫无怨言地接受它,但array已经被声明为“类型为BST”的数组,所以数组中每个元素必然是BST对象,这时编译器就会被误导,以致产生不可预期的结果。

另外,C++语言规范中说,通过base class指针删除一个由derived classes objects构成的数组,其结果未定义。当数组被删除时,数组中每一个元素的destructor都必须被调用,而该元素被声明为base class类型,同样对编译器产生了误导。

简单地说,多态和指针算术不能混用。数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用。

HFSS实战项目——Ku波段微带发夹线滤波器 保姆级教程!!!看完必会,非常详细!!!Ku频段5阶切比雪夫微带线带通滤波器的仿真实例。首先介绍了滤波器的技术指标和基本理论知识,重点介绍了滤波器的耦合系数和外部品质因数。建立了谐振器的设计模型、耦合系数与谐振器间距的设计模型、外部品质因数与抽头位置的设计模型和滤波器整体电路的模型。详细介绍了谐振器设计模型的建立步骤。 阅读详情

相关推荐

道闸不自动落杆故障排查:从传感器原理到控制器调试全解析

在工业自动化和物联网系统中,传感器与控制器构成的闭环控制是保障设备可靠运行的核心。其基本原理是通过传感器采集环境状态,控制器依据预设逻辑做出决策并驱动执行器动作。这一技术价值在于实现了无人值守下的安全、高效自动化,广泛应用于智能交通、安防和智能楼宇等领域。以停车场道闸系统为例,其自动落杆功能高度依赖地感线圈与防砸雷达的协同。地感线圈作为触发单元,负责感知车辆接近;而防砸雷达则作为持续监测的安全单元,通过微波探测防砸区域内是否有障碍物,其信号是控制器执行落杆决策的关键依据。当系统出现车辆通过后闸杆不落的典型故

weixin_29190651的博客 311

More Effective C++ 学习笔记(1)

不要对数组使用多态   类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码几乎从不如你所愿地那样运行。 假设你有一个类BST(比如是搜索树对象)和继承自BST类的派生类BalancedBST: class BST { ... ...

weixin_30292843的博客 173

《点亮创新灯塔!AI应用架构师与中小学初等教育AI智能体,共筑智能化教育辅助创新灯塔》

中小学AI智能体,是基于AI技术,能感知教育场景、理解教育规律、辅助教师教学和学生学习的智能系统。做老师“做不了”的事:比如5分钟批改45本作业,精准统计每个学生的易错点;做老师“做不好”的事:比如根据学生的学习风格(视觉/听觉/动觉)推荐个性化内容;绝不做老师“该做的事”:比如情感交流、价值观引导、创意教学设计——这些“人的温度”,AI永远无法替代。我是林宇,资深AI应用架构师,专注教育AI领域8年,参与过10多个中小学AI智能体项目,曾为北京、上海、深圳等城市的100多所学校提供AI教育解决方案。

Java大师兄的博客 433

More Effective C++ 条款3 (转)

More Effective C++ 条款3 (转)[@more@]条款3:不要使用多态性数组 类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允...

csd3176的博客 214

MCU 微控制器,在实际项目中如何选型(以 STM32为例)

1.MCU 选型需要考虑的一些因素 2.案例:传感器设备的 MCU 选型

创享 AIOT 的专栏 1万+

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

Item3 不要对数组使用多态

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码几乎从不如你所愿地那样运行。 现在我们定义一个基类和派生类:sizeof(CBase) = 4,sizeof(CDerived) = 8; class CBase{ public:   ...

CherishPrecious的博客 320

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1182

c++ 不要以多态的方式处理数组

数组元素的获取其实就是数组的头指针加上偏移量来获得数组的某个元素,即例如数组array[10],而数组头指针地址为array,每个元素的size为sizeof(array[0]),那么array[2]的地址为array+size*2。而对于多态的方式作为数组的具体元素,那么会出现某个元素定位不准的情况。例如base类的大小sizeA,而继承类的大小一般都会比base类要大。如果现在存取数组元素,虽

Kikim的地盘 1651

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

东北大学计算机预推免(双非友好)

东北大学,个人觉得在985里面对双非比较友好,而且学校的计算机专业实力也比较强,上岸难度不算很大,可以重点关注一下。学校复试审核的时间比较早,拿到复试资格之后,一定要留意报名系统首页中计算机学院的信息,学校也会在全国各地不同时间安排面试,可以根据自己的情况选择一个合适的时间前去面试,并且有对应面试场次的QQ群,信息会在群里面发布。面试成绩会在预推免系统中直接公布,但是是否拟录取不会公布,需要考生自行判断,今年计算机学院录取线定在了86分左右,最终递补下来,好像录取到了84分左右。

D1379951481的博客 3120

More Effective C++议题【三】:不要对数组使用多态

> 学习笔记【三】 这个议题的实际意义在于对多态的size要有清晰的理解和把控。建议中给出了如下出错代码 : //注意!这是错误的代码 class BST { ... }; class BalancedBST: public BST { ... }; int printBSTArray( ostream& s, const BST array[],

心宽体宽的宽宽 803

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

More Effective C++:条款3:绝对不要以多态的方式处理数组

继承很重要的一个性质是 可以通过指向基类的指针/引用操作衍生类 C++也允许通过基类的指针操作衍生类的数组,但是操作的结果几乎不会按照预期进行。 打印BST数组中所有内容 void printBSTArray(ostream& s,const BST array[],int num){ for(int i =0; i < num; ++i){ s << array[i]; } } 调用 BST BSTArray[10]; printBSTArray(cout, BSTA

qq_49735865的博客 214

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

条款3:绝对不要以多态(polymorphically)方式处理数组

继承的最重要特性之一就是,你可以通过指向基类的指针或者引用来操作派生类对象。但是,如果你通过基类指针或者引用来操作派生类所形成的数组,它绝对不会按你预期地运行。 例子://BalancedBST继承于BST类 void printBSTArray(ostream& s, const BST array[], int numElements) { for(int i = 0; i < numEl

江淮猫 843

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

条款3-4:绝对不要以多态的方式处理数组与default constructor

条款3:绝对不要以多态的方式处理数组 class BST{ ...... }; class BalancedBST:public BST{.......}; void printBST(ostream& s,const BST array[ ],int num) {    for(int i = 0;i      s } 当你传入BST的数组是没有什么问题的。 现在传入B

652

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

More effective C++:条款3.绝对不要以多态方式处理数组及条款4:非必要不提供default construcor

More effective C++:条款3.绝对不要以多态方式处理数组及条款4:非必要不提供default construcor

qq_43847153的博客 460

读《More Effective C++35个改善编程与设计的有效方法》之条款3:绝对不要以多态方式处理数组

有以下程序: class Base { public: Base(int n = 0) : _b(n) {} int _b; }; class Devide : public Base { public: Devide(int n = 0, int m = 0) : Base(n), _d(m) {} int _d; int _d1; }; void print(std::ostr

smsmn的专栏 930

MEC | 条款3 绝对不要以多态(polymorphically)方式处理数组

因此,编译器为PrintBSTArray 函数所产生的指针算术表达式,对于 BalancedBST objects 所组成的数组而言就是错误的。所以删除 derived class 的时候,会调用基类的析构函数,解决这种办法需要将基类的析构函数设为虚函数。编译器假设数组中每个元素的大小是 BST 的大小,但其实每个元素大小是 BalancedBST 的大小。当数组被删除,数组中每1个元素的 destructor 都必须被调用,编译器其实看到的这样的句子。是个指针,指向数组起始处。所指内存两者相距多远?

RandyOliver's House 201

More Effective C++ 条款03:绝对不要以多态方式处理数组

More_Effective_C++03

君鼎的博客 560

More Effective C++ 条款3 绝对不要以多态(polymorphically)方式处理数组

1. 对于数组作为参数的传递只有按引用传递或者传递首元素的地址,不存在按值传递。 2. 将派生类对象的数组传递给接受一个基类对象的数组作为参数的函数时,传递的实际上是首元素的地址,因而会造成“元素错位”现象,在此情况下,如果在函数中进行了指针的算数操作,将会导致灾难性的后果。 4. 比较隐蔽的指针算数操作: array[i]:实际上代表*(array+i) del...

ddzai7557的博客 197

《More Effective C++》《基础议题——3、绝对不要以多态方式处理数组》

书山有路勤为径,学海无涯苦作舟。

zwh1298454060的博客 517

More Effective C++(条款三:绝对不要以多态方式处理数组)

继承的重要性质之一:通过“指向基类的指针或引用”,操作继承类对象。如此的指针或引用,其行为是多态的。c++允许通过“基类的指针和引用”来操作“继承类对象形成的数组”。但是:1、class BST{...}; class BalanceBST:public BST{...}; void printBSTArray(ostream&amp; s,const BST array[],int numEle...

Unique-You的博客 333

条款3.绝对不要以多态的方式处理数组

1. 多态与指针算术不能混用,数组对象几乎都会涉及到指针的算术,因此数组不要和多态混用。 2. 数组与多态混用的情况下:数组元素的访问和删除都会出现不可预期的结果。 转载于:https://www.cnblogs.com/braveone/p/6598212.html...

weixin_30815469的博客 98

C++以多态方式处理数组可能会遇到的问题

今天读《More Effective C++》时遇到一个条款:绝对不要以多态方式处理数组。以前自己也没有注意过,觉得有必要记录下来。 C++是允许通过base class的指针或引用来操作derived class所形成的数组的。但发生的事情可能会令你感到意外。下面举例说明: 基类和派生类是这样的: class BST /*ba...

weixin_33918114的博客 167
上一篇: 条款2:最好使用C++转型操作符
下一篇: 条款4:非必要不提供default constructor
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值