Effective C++ 读书笔记 条款36:绝不重新定义继承而来的 non-virtual 函数

Effective C++ 条款36:绝不重新定义继承而来的 non-virtual 函数 深入解析 Effective C++ 条款36,理解为什么不应该重新定义继承而来的 non-virtual 函数,掌握静态绑定与动态绑定的本质区别,避免面向对象设计中的常见陷阱。 阅读详情

Core List

1. 重新定义 non-virtual 函数的问题

    Derived x;     

    Base *pBase = &x;

    pBase->fun();   // 调用Base的 fun 函数

    Derived *pDerived = &x;

    pDerived->func();    // 调用Derived 的 fun 函数

    结论: non-virtual 函数是静态绑定,函数行为取决于“指向该对象的指针”。

                 virtual 函数是动态绑定,函数行为取决于“指针指向的对象”。


2. 论证

Derived 重新定义 Base 的 fun:每一个Derived 都是一个Base不为真。

EVE-NG 新增 qcow2 镜像教程 本文介绍了如何在 EVE-NG 网络仿真平台中添加 QCOW2 镜像并配置 YML 文件。首先,用户需要了解 EVE-NG 的目录结构,上传并重命名 QCOW2 镜像,然后设置文件权限并刷新界面以识别设备。接着,讲解了 YML 文件的作用,它用于定义设备的CPU、内存、网卡等参数,并给出了配置示例。若有多个设备版本,可以通过复制并重命名 YML 文件使其独立显示。最后,通过检查 QEMU 进程和日志验证 YML 配置是否生效。总结部分强调了 EVE-NG 的自动识别机制以及独立管理设备版本的方式。 阅读详情

相关推荐

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南

本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。

weixin_42525005的博客 220

指向C++类虚成员函数指针的释疑

指向基类的虚成员函数的指针赋值为基类的虚成员函数地址,如果派生类覆写了基类的对应虚函数,那么当用派生类的对象来调用该虚成员函数指针时,调用的是派生类虚函数!见下面的实例。 #include <iostream> using namespace std; class Base { public: virtual void Func() { cout << "Base Func\n"; } }; class Derived : public Base { public: v

binaryhead的专栏 429

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1729

读书笔记《Effective C++》条款36:绝不重新定义继承而来的non-virtual函数

条款32说过,所谓public继承意味is-a(是一种)的关系。条款34则描述为什么在class内声明一个non-virtual函数会为该class建立一个不变性,凌驾其特异性。如果将这两个观点施行于两个class Base和Derived以及non-virtual成员函数Base::mf身上,那么: 1.适用于Base对象的每一件事,也适用于Derived对象,因为每个Derived对象都是一

Do-Program的专栏 290

SAP子公司财务账套配置实战:从公司代码到记账期间变式的关键步骤

本文详细介绍了为SAP子公司快速配置财务账套的实战步骤。通过复用母公司成熟配置,重点阐述了从创建公司代码、关联控制范围到分配记账期间变式的核心流程,帮助顾问在一两个小时内完成核心骨架搭建,实现高效集团财务管控。

cake8的博客 165

【硬核指南/MI50 32G/Ubuntu】从零部署大模型:MI50显卡Ubuntu系统驱动安装与避坑全记录

本文详细记录了在Ubuntu系统上为AMD MI50显卡安装驱动并部署大模型的完整流程,包括硬件兼容性检查、BIOS关键设置、系统安装优化、ROCm驱动安装及常见问题解决方案。特别针对MI50显卡在X99平台上的特殊配置需求提供了实用技巧,帮助用户避免常见陷阱,提升大模型训练效率。

weixin_42520909的博客 806

《Effective C++》读书笔记 条款36:绝不重新定义继承而来的non_virtual函数

该条款告诉我们不要重新定义继承而来的non_virtual函数,因为派生如果重新定义了继承而来的non_virtual函数会将基类的该函数遮盖,不符合public继承的is-a原则。 先来看一段简单的代码 class base { public: void mf(); }; class Deriverd :public base { }; Deriverd D; base *pB = &a...

junya_zhang的博客 287

Luma AI技术浅析(一)

是一款基于人工智能的3D内容生成平台,旨在通过深度学习技术实现高效、高质量的3D场景、物体和动画的生成。Luma AI 主要利用了等技术,以实现从图像、视频到3D模型的转换和生成。

m0_75253143的博客 1728

Effective C++ | 读书笔记 (三)

提前定义变量,有可能导致变量并没有使用(如中间抛异常了),而平白多了一个构造和析构成本。但是循环怎么办?// 方式AWidget w;i < n;...// 方式Bi < n;++i) {...做法A:1个构造 + 1个析构 + n个赋值操作做法B:n个构造函数 + n个析构函数打破本条款选择A的依据:(1)你知道赋值成本比“构造+析构"成本低。(2)你正在处理代码中效率高度敏感的部分。否则你应该使用做法B,维持变量尽可能在使用时定义的原则。请记住。

m0_74795952的博客 945

AI Agent驱动的多模态情感分析方法:从BERT到Vision Transformer的探索

情感分析(Sentiment Analysis)是自然语言处理(NLP)与计算机视觉(CV)中一项重要任务。传统的情感分析主要依赖于文本数据,但在现实应用中,情感往往通过 语言、语音、表情、姿态 等多模态信号共同传达。因此,结合 多模态深度学习 的 AI Agent 在情感理解中具有广阔的前景。

一键难忘的博客 738

【Hermes Agent】2026 Hermes Agent 最新入门级实战指南:从原理、部署、模型配置到落地 Demo

当下 Vibe Coding、AI 自动化时代,单纯对话大模型已经没有竞争力,

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 244

Effective C++ 读书笔记 Item36 绝不重新定义继承而来的 non-virtual 函数

从规范上说, 条款 34 提到,如果某个操作在整个继承体系应该是不变的,那么使用 non-virtual 函数,此时派生类从基类继承接口以及一份强制实现。如果派生类希望表现出不同行为,那么应该使用 virtual函数。 我们还是在讨论public继承,比如Derived继承自Base。如果Base有一个非虚函数func,那么客户会倾向认为下面两种调用结果是一样的: Derived d; Ba...

Vermont_的博客 251

基于Python实现人脸识别相似度对比

随着人工智能技术的不断进步,人脸识别成为了一种广泛应用的技术。人脸相似度对比是其中的一个重要应用场景,可以用于人脸搜索、身份验证等方面。本文将介绍如何使用Python实现人脸相似度对比。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 9809

《Effective C++》 读书笔记 条款36-40

Effective C++ 36-40 Note 条款36:绝不重新定义继承而来的non-virtual函数 如果D重新定义函数mf: 非虚函数都是静态绑定的,指针是什么类型就调用什么类型。如果派生类重新定义了非虚函数,就会发生遮掩,导致派生类和基类调用的函数版本不一样! 条款37:绝不重新定义继承而来的缺省参数值 绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual函数却是动态绑定的 因为函数参数是动态绑定的,如果在派生类的虚函数中重写了缺省参数值,当通过一个指向派

youyadefeng1的博客 196

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

读书笔记《Effective C++》条款37:绝不重新定义继承而来的缺省参数值

virtual函数系动态绑定,而缺省参数值却是静态绑定。

Do-Program的专栏 354

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《Effective C++》读书笔记之item36:绝不重新定义继承而来的non-virtual函数

1.任何情况下都不应该重新定义一个继承而来的非虚函数。如果重新定义,会出现“静态绑定”,只有声明为虚函数才能实现“动态绑定”。 2.条款7“为多态基类声明虚析构函数”是本条款要求的特例:派生类可能有更多的成员变量和相应操作,因而析构函数必须与基类不同,采用虚析构函数的方法可以使用“动态绑定”从而产生安全的析构行为;反之,如果声明为非虚析构函数,必须重新定义,这和本条款的要求相违背。

banguijun的专栏 586

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Effective C++读书笔记(24)

条款36:绝不重新定义继承而来的non-virtual函数 Never redefine an inherited non-virtualfunction 有如下代码: class B { public:     void mf();     ... }; class D: public B { ... }; 虽然我们对B,D或mf一无所知,但面对一个类型为D的对象x: D x

pandawuwyj的专栏 825

《Effective c++》读书笔记 6.继承与面向对象设计

public继承意味着“is-a”,virtual函数意味“接口必须被继承”,non-virtual函数意味“接口和继承都必须被继承” 32.确定你的public继承塑模出is-a关系 **public继承意味着“is-a”关系:**令D以public继承B,说明每一个D类型的对象同时也是一个B类型的对象。能够对B对象做的每件事情,一样可以施行在D对象身上,反之则不行。(D具有B不具有的特性) 33.避免遮掩继承而来的名称 普通作用域问题: 涉及继承的作用域问题 遮掩的情况:派生类的名称会遮掩基类的名称

ziggy7的博客 186

Effective C++读书笔记一 条款36 绝对不要重新定义public继承来的non-virtual函数

Effective C++36 never refine inherited non-virtual function1.实验如果违反该条规则会如何#include <iostream> using namespace std;class B{ public: void mf(){ cout<<"base"<<endl; } }; cl

axiaojikuaipao的博客 320

《Effective C++》读书笔记第六章——继承与面向对象设计(Inheritance and Object-Oriented Design)

条款32:确定你的public继承塑模出is-a关系 Make sure public inheritance models “is-a” “public继承”意味着is-a。适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对象也都是一个base class对象。 eg: 1、“所有的鸟都会飞,企鹅是鸟,但是企鹅不...

哈哈哈哈嘿嘿嘿 334

effective C++ 读书笔记 条款36-37

条款36:绝不重新定义继承而来的non-virtual函数 重要点:non-virtual函数都是静态绑定 // 1241.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; class Base { public: void func() { cout<<

CppPlayer 1031

[读书笔记] Effective C++

条款02:尽量以const,enum,inline替换#define 对于常量宏定义,最好用const代替#define 对于函数宏定义,最好用inline代替#define #include、#ifdef、#ifndef仍被需要 条款03:尽可能使用const -* 条例04:确定对象被使用前已先被初始化 内置对象记得手动初始化 使用成员初始列替换赋值操作 以local static替换non-local static 单例模式 ...

一串代码的博客 387

《Effective C++》读书笔记6.继承与面向对象设计

继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 public继承意味is-a。适用于base classes身上的每一件事情一定适用于derived classes身上,以为每一个derived class对象也一定是一个base class对象 条款33:避免遮掩继承而来的名称 derived class作用域被嵌套进base class作用域内,类似于local和global。derived中的函数会遮掩base中的所有同名函数,即使他们参数不同。 解决方案 用using声明

Estrike的博客 220

Effective C++读书笔记10(35~36)

条款35:考虑virtual函数以外的其他选择 设计一款游戏,为不同的人物设计不同的计算健康指数的函数,那么使用virutal函数很自然: class GameCharacter{ public: virtual int healthValue() const; //... };现在来考虑virtual函数的替代方案。 1.藉由Non-virtual interface手法实现Tem

liyongOFDM的专栏 846

Effective C++ 读书笔记(六) 继承与面向对象设计

条款32:确定你的pubilc继承塑模出is-a关系                                    Make sure public inheritance models “is-a” –  C++进行(OOP)面向对象编程,最重要的一个规则是:public inheritance (公开继承)意味“is - a”(是一种)关系。 –  如果你令class D(“de

net_assassin的专栏 4229

Effective C++ 读书笔记之Part6.Inheritance and Object-Oriented Design

32.Make sure public inheritance models "is-a". 所谓的最佳设计,取决于系统希望做什么事,包括现在与未来。 需要解决的问题:其中关于两个assert都通过的地方有些疑惑。 总结: “public继承”意味着is-a。适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对

SHINING的博客 2270
上一篇: Effective C++ 读书笔记 条款22:将成员变量声明为private
下一篇: Effective C++ 读书笔记 条款37:绝不重新定义继承而来的缺省参数值
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值