C++学习笔记(Thinking in C++)五

《C++编程思想》(Thinking in C++)部分精华提取 1、声明与定义: 首先,必须知道“声明”和“定义”之间的区别,因为这两个术语在全书中会被确切地使用。“声明”向计算机介绍名字,它说,“这个名字是什么意思”。而“定义”为这个名字分配 存储空间。无论涉及到变量时还是函数时含义都一样。无论在哪种情况下,编译器都在“定义”处分配存储空间。对于变量,编译器确定这个变量占多少存储单元,并在内存中产生存放它们的空间。对于函数,编译器产生代码,并为之分配存储 阅读详情

1、关于虚函数一些注意点

 class Base{
public:
        virtual void display(){
                cout<<"Base display"<<endl;
        }
};
class CTest: public Base{
public:
        void display(){
                cout<<"CTest display"<<endl;
        }
};
void fun(Base &b){
        b.display();
}
void fun2(Base b){
        b.display();
}
void fun3(Base *b){
        b->display();
}
int main(void){
        CTest ct;
        fun(ct);
        fun2(ct);
        fun3(&ct);
        return 0;
}

重点:要实现虚函数的效果,必须在参数调用的时候实用指针或者引用,如果使用值传递的话,则会调用基类的函数。这是因为每个有许函数的类编译器都会创建一个vtable,并且他们的vptr都在相同的位置。如果使用值传递,则派生类的vtable不会被拷贝到基类对象中。

2、当继承几个抽象基类时,必须实现所有的纯虚函数,否则继承出的类也将是一个抽象类。

     如果类中声明一个纯虚函数,则这个类的VTABLE就是不完全的。

     在基类中,对纯虚函数提供定义是可能的。但是不能定义为inline函数。例如下面这种方式:

class base{

public:

virtual void show()=0 {cout <<"base:"<<endl;}//错误:这种inline方式定义纯虚函数是错误的。

virtual void display() = 0;

};

void base::display(){cout<<"base"<<endl;}//正确的定义。


纯虚函数的原理:

至于纯虚函数的实现
virtual void x() = 0;
这句,等于告诉编译器在VTABLE中为函数保留一个间隔,但在这个特定间隔
中不放地址。只要有一个函数在类中被声明为纯虚函数,则VTABLE就是不完全的

这样当某人试图创建这个类时,编译器会由于不能安全的创建一个纯抽象类的对象
而发出一个出错信息,这样编译器就可以保证抽象类的纯洁性,不会被误用

3、类型转化的问题;

  1 #include <iostream>
  2 using namespace std;
  3
  4 class NVBase{
  5 public:
  6         void display(){}
  7 };
  8 class VBase{
  9 public:
 10         virtual void display(){}
 11 };
 12 class CNVBA: public NVBase{};
 13 class CNVBB: public NVBase{};
 14
 15 class CVBA:public VBase{};
 16 class CVBB:public VBase{};
 17
 18 class COther{};
 19
 20 int main(void){
 21         NVBase* b = new CNVBA;
 22         CNVBA *cta = static_cast<CNVBA *>(b);
 23         CNVBB *ctb = static_cast<CNVBB *>(b);
 24   //COther *cos = static_cast<COther *>(b);//error: invalid static_cast from type ‘NVBase*’ to type ‘COther*’
 25         cout<<"NVBA:"<<(long)cta<<" NVBB:"<<(long)ctb<<" other:"<<(long)cos<<endl;
 26        //输出是:NVBA:143290376 NVBB:143290376 other:


 27         //CNVBA *ctad = dynamic_cast<CNVBA *>(b);//error:(source type is not polymorphic
 28         //CNVBB *ctbd = dynamic_cast<CNVBB *>(b);//error:(source type is not polymorphic
 29         //COther *cod = dynamic_cast<COther *>(b);//error:(source type is not polymorphic
 30
 31         VBase* vb = new CVBA;
 32         CVBA *vba = static_cast<CVBA *>(vb);
 33         CVBB *vbb = static_cast<CVBB *>(vb);
 34  COther *vcos = static_cast<COther *>(vb);//error: invalid static_cast from type ‘NVBase*’ to type ‘COther*’
 35         cout<<"VBA:"<<(long)vba<<" VBB:"<<(long)vbb<<" other:"<<(long)vcos<<endl;

              //输出是:VBA:143290392 VBB:143290392 other:
 36
 37         CVBA *vbad = dynamic_cast<CVBA *>(vb);
 38         CVBB *vbbd = dynamic_cast<CVBB *>(vb);
 39         COther *vcod = dynamic_cast<COther *>(vb);
 40         cout<<"VBA:"<<(long)vbad<<" VBB:"<<(long)vbbd<<" other:"<<(long)vcod<<endl;

              //输出是:VBA:143290392 VBB:0 other:0 

 41         return 0;
 42 }
综上所述,static_cast<>可以实现非虚和虚函数的转化,但是不支持非派生类的向下转化;dynamic_cast<>只能实现有虚函数的向下转化;强制转化COther *o=(COther*) vb;或者b都可以实现强制转化。

 

 

深入理解C++:《Thinking in C++》实践教程 本文还有配套的精品资源,点击获取 简介:《Thinking in C++》是Bruce Eckel的经典C++编程教程,分为两卷,覆盖了C++的基础语法和高级主题,如模板和设计模式。本书强调面向对象编程核心概念,通过实例详细讲解构造函数、析构函数、虚函数、内存管理以及STL的使用。同时,书中还包括了C++的模板和模板元编程等高级特性,帮助程序员深入理解和掌握C++,成为熟练... 阅读详情

相关推荐

深入掌握C++:《Thinking in C++中文版》学习指南

面向对象编程(OOP)是C++的核心特性之一,它通过类和对象来模拟现实世界中的实体和行为。类可以看作是创建对象的蓝图或模板,而对象是类的实例。类的定义使用关键字class或struct,包含数据成员(属性)和成员函数(方法)。例如:public:int age;对象的创建和使用需要先声明变量,然后使用类名加上作用域解析运算符来创建对象:函数对象(也称为仿函数)是一种可以像函数一样调用的对象。它重载了operator(),使得对象可以被像函数一样调用。

weixin_34620658的博客 1080

使用dynamic_cast报错source type is not polymorphic

#include  using namespace std;  class C{   public:   virtual ~C(){}////////////基类必须要加这个虚函数,不然就会报以下错误,  };  class A:public C{  };  class B:public C{  }; int main(){ C* pa=new A(); B* pb=dyn

QingTC 1万+

《Thinking in C++》第一卷习题答案解析

本文还有配套的精品资源,点击获取 简介:《Thinking in C++》是Bruce Eckel编写的一本C++编程指南,分两卷介绍C++基础和高级特性。第一卷强调基础概念,如面向对象编程、类和对象的创建与管理、C++标准库以及异常处理。本资源提供第一卷习题的解答和相关HTML文档,帮助读者深入理解C++语言,同时提醒遵守版权法规。 1. 面向对象编程基础 ...

weixin_42613360的博客 995

std::dynamic_pointer_cast 遭遇错误 source type is not polymorphic

std::dynamic_pointer_cast 遭遇错误 source type is not polymorphic 原因就是要进行转换的类型不是多态的,即没有虚函数 简单的将基类的析构定义成基类就行了 virtual ~A() = default; ...

wwyyxx26的专栏 4210

《Thinking in C++》pdf电子版

《Thinking in C++》的pdf电子版,对应的中文书籍叫《C++编程思想》。这本是英文版的。

CNVBB 3.0.1 HACK版

1.WINDOWS 2000或以上, LINUX, FREEBSD等操作系统   2.APACHE, IIS等标准网络环境   3.PHP 4.3.x 环境(www.php.net)   4.ZEND 编码支持(www.zend.com)   ###### 3.01插件列表 ######   1.QQ模块   2.联盟论坛系统   3.首页公告模块   4.银行系统   5.买卖限制系统   6.在线媒体播放支持   7.性别插件   8.预览主题自由选择回帖方式或主题方式   9.更全面的中文支持   10.在线列表的排列方式调整   11.自由选择回帖后返回的方式。   .....     ############################   ###### 安装方法(请务必仔细查看) ######   ############################   1.首先请确定服务器已安装了zend模块支持,否则将无法正常安装程序,   请自行通过phpinfo信息查看服务器运行环境,如未安装,请登录   http://www.zend.com/store/free_download.php?pid=13   下载最新版的zend optimizer来进行服务器配置。   2.安装前请打开includes文件夹内的config.php.new文件进行基础配置,   配置完毕后重新命名为config.php,并上传到相同的目录内。   3.请登?a\u00a0href='\u7cf7ttp://www.cnvbb.com/bbs/vipreg.php\u9875\u9762\u7533\u8bf7\u7f51\u7ad9\u4e13\u7528\u6fc0\u6d3bKEY\uff0c'    \u00a0target='_blank'>糷ttp://www.cnvbb.com/bbs/vipreg.php页面申请网站专用激活KEY,   请务必仔细填写详细资料,此份资料一次申请后将无法更改,为确保能正   常安装,请不要在此页面进行测试。   4.将下载下的key.dat文件上传到网站根目录内,此KEY为验证信息,在安   装前请妥善保留好这个文件。   5.执行install目录内的install.php文件,根据需要进行全新安装或升级,   并按照操作提示执行。   6.在最后一步,将进行服务器信息验证,为确保正确运行,请务必确保所   安装的网址与申请网址相同,并仔细看清楚这个提示页面的文字信息,一   次安装后,这个KEY将无法再次进行新安装,如需要,请通过备份文件或在   网站上重新下载。   7.安装完毕后,为了确保安全,请务必删除install目录。   8.登录./admincp目录进行后台管理配置。       此版本将是作为 CNVBB 的最后一版 vBulletin 插件版程序提供下载,自此后   CNVBB将不再进行任何有关 vBulletin 的开发,也将在稍后的日子里关闭 vbb   交流区。   中国的网络就是如此,用这别人辛苦做的程序,嘴里却又说这不好,说那烂,   我从事IT行业也已经将近5年的时光,经历过网络的发展,但现在已完全失去了   当年交流讨论的氛围,可以看到,在3年前存在的技术交流网站,在现在几乎已   全部不付存在,这就是当今网络的现实。希望那些成天背后说人家不好的朋友,   请先自醒,也许因为你的一句话,中国就从此少了一位辛勤开发的程序员。也许   你的一句鼓励,中国会多更多为大家服务的朋友。   也许有人说我唯利是图,为了小小的100块 VIP 费用,精力却不原意花在月薪5、6K   的工作上,既然已经是最后的一个vbb程序了,不想再多解释,一切已经过去,   也不会再有第二次。   认真做好自己,认真做人。   新论坛马上就将启动,最后的一版vbb,最后的告别。   

C/C++:类型转换

C++:dynamic_cast、static_cast

test1280 848

vbb语言包

vbb语言包 zjfnet.vb4.1.7.lang.7z

c++ 类型转换与explicit

c++ 类型转换与explicit 本文试图搞清楚这样2个问题: c++ 类型转换有哪些?作用分别是什么?实际工程中应该怎么用? 经常查看标准库源码的同学会发现标准库中很多类构造函数会带有explicit声明,explicit关键字是为了做什么的? 一、c++的类型转换简介 可不要上来就说4种类型转换昂。。类型转换按照触发条件分可分为:隐式类型转换,显式类型转换;而按照行为分可分为:static,dynamic,const,reinterpret。我们先按照行为划分介绍4种类型转换: 1. static

weixin_42923076的博客 708

vbb____CNvbb 3.0 rc2汉化版

<br> 目前希望大家协助测试中文翻译不准确之处,程序代码现在未做过修改,所以关于BUG问题,不在此版测试的范围内。<br> <br> 程序包请大家下载附件的3个帖子,合并,执行install目录中的install.php 安装包<br> <br> 此版本仅加入了QQ插件,本来准备今天开发银行插件的,由于加班原因,未做成<br> <br> <br> (由于升级文件有些错误,请大家不要测试升级)

威力导演10破解文件

亲测可用,威力导演 威力导演10 破解 注册机 key

C++ type cast

static_cast is used for cases where you basically want to reverse an implicit conversion, with a few restrictions and additions. static_cast performs no runtime checks. This should be used if you

#+! 1725

LVGL 9.4 性能调优实战:如何通过脏区合并与tile分块,让你的嵌入式UI流畅度翻倍

本文深入探讨LVGL 9.4中的性能优化技术,重点介绍脏区合并与tile分块如何显著提升嵌入式UI流畅度。通过实战案例和源码分析,详细解析局部刷新策略、显示框架调优及性能瓶颈诊断方法,帮助开发者在STM32、ESP32等资源受限设备上实现丝滑的UI体验。

weixin_28678831的博客 450

C++编程思想(Thinking in C++)完美版pdf资源介绍

C++编程思想(Thinking in C++)完美版pdf资源介绍 【下载地址】C编程思想ThinkinginC完美版pdf资源介绍 《C++编程思想(Thinking in C++)完美版pdf》由C++权威Bruce Eckel倾力打造,全面覆盖C++编程从基础到高级的各个层面。本书深入浅出,不仅讲解了对象导言、数...

gitblog_06775的博客 792

简易电梯控制系统设计(两层楼)(

(电子科技大学 数字系统实验二 结课验收项目 ) 题目要求:

m0_48801027的博客 1万+

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 360

Thinking in C++ 简体中文第二版

 首页(FrontPage)Winner, Software Development Magazine’s 1996 Jolt Award for Best Book of the Year这本书的出版是一项巨大的成功,毋庸质疑,如果您拥有了它是很值得的。本书对有关输入输出流的章节的诠释是迄今为止我所见到的综合性最强且最通俗易懂的。Al Stevens Contributing E

huangyong的专栏 6724

Android Studio连接手机详细教程(包含遇到的问题集)

如果以上内容全都调试正确了,还是存在这个无法安装的问题,多半是一开始用的别的手机进行调试安装,然后抽掉线重新换上另一个手机安装调试才会报错。无法识别的 USB 设备,跟这台计算机连接的前一个 USB 设备工作不正常,Windows 无法识别它。此时,我的开发者选项已经开启,并且windows系统和android studio已经能够识别我的设备了,但还是报了这样的错误。右击你的手机——>更新驱动程序——>浏览我的计算机以查找驱动程序软件。右击此电脑——>属性——>设备管理器——>便携设备。

IT小郭的技术博客 4万+

C++编程思想Thinking in C++完美版pdf资源介绍

C++编程思想Thinking in C++完美版pdf资源介绍 【下载地址】C编程思想ThinkinginC完美版pdf资源介绍 《C++编程思想(Thinking in C++)完美版pdf》由C++权威Bruce Eckel倾力打造,全面覆盖C++编程从基础到高级的各个层面。本书深入浅出,不仅讲解了对象导言、数据抽...

gitblog_06727的博客 525

保姆级教程:用Multisim仿真快速上手二极管、MOSFET和IGBT的开关特性

本文提供了一份详细的Multisim仿真教程,帮助读者快速掌握二极管、MOSFET和IGBT的开关特性。通过搭建实验电路、观察波形特征和参数影响分析,深入解析了反向恢复过程、米勒平台现象和拖尾电流效应。适合电力电子初学者和工程师通过仿真建立直观理解,提升电路设计能力。

weixin_29290863的博客 498

YOLOv11知识蒸馏,实现无损涨点,包含逻辑蒸馏和特征蒸馏中的不同蒸馏方法,适用专栏内的所有模型

知识蒸馏(Knowledge Distillation)是由 Hinton 等人在 2015 年提出来的,主要是用一个复杂的教师模型去指导一个简单的学生模型训练,这样能让学生模型在保持高精度的同时,还能减少计算量。本文便是讲解如何针对的原始模型以及改进后的模型进行知识蒸馏,轻松实现无损涨点。知识蒸馏的核心在于利用已训练好的复杂模型(教师模型)去指导一个更简单的模型(学生模型)进行训练,以此让学生模型在保留较高精度的同时,降低计算成本。特征蒸馏(Feature Distillation)是知识蒸馏的一种形式,

Limiiiing的博客 4959

Thinking in C++ 第二版 简体中文版 前言

 前言(Preface)象任何一种人类语言一样,C++提供了一种表达概念的方法。如果这种方法成功的话,那么当问题的规模以及复杂性逐渐变大时,这种介质将比其它方式更有力,而且使用也更简单、更灵活。不能将C++看作一些特性的简单集合,其中的一些特性单独使用的话是没什么意义的。在设计和编码的时候应该把它们当作一个整体来考虑。要真正理解这一点,需要了解C语言一些问题,以及编程中会出现的一般性问

huangyong的专栏 4553

BurpSuite工具HaE插件好用正则收集

数据集合面板里面直接查询捕获到的相关数据内容,省去一个个翻找数据包内容的烦恼。插件捕获到匹配正则表达式的数据包后,可以在。可以对正则条目进行添加、编辑、删除。规则信息管理,我们点击。

墨痕诉清风的博客 646

C++学习笔记(Thinking in C++) 一

1、解析器与编译器    a、解析器是将源代码转化为一些动作(它可由多组机器指令组成)并立即执行这些动作;      好处:写代码到执行代码速度快;很快之处源代码错误的地方;交互性好;      坏处:解析器必须翻译任何重复的代码,程序执行就会变慢;解析器必须驻留内存,以执

libaohan的专栏 1026

2025MCM美赛 数学建模 问题 C:奥运奖牌榜模型 思路+matlab代码+python代码

目录问题一详细思路步骤1. 数据准备与预处理2. 特征选择与构建3. 模型选择4. 模型训练与评估5. 预测与不确定性分析6. 分析与结果解释步骤详细代码实现python代码代码解析matlab代码问题二详细思路解决方案步骤1. 构建生产模型:2. 优化决策:3. 代码实现:代码解析matlab代码问题三的详细思路解决思路:代码实现1. 数据准备2. 代码实现matlab代码在这个问题中,我们的目标是根据历史奥运会的数据,建立一个模型来预测2028年洛杉矶奥运会各国的奖牌数。具体要求是:首先,整理并加载奥运

斌擎科技 2144

假人有限元模型

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

Thinking in C++【2】C++中的C

1.创建函数 在调用函数时,编译器只是检查参数的类型,使用标识符只是为了方便阅读。因此以下声明函数是可行的。 //函数声明 int translate(float, float, float); func() 在C++中,意味着该函数有空的参数列表;在C中,意味着不确定的参数数目(这是C的漏洞,因为在这种情况下,不能进行类型检查)。 2.通过库管理器创建自己的库 自己创建的库头文件放置在预处理器搜索路径 中的某处,或者在当前目录中(以便能被 #include “头文件” 发现),或在包含路径中(

qq_43118572的博客 214

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: C++学习笔记(Thinking in C++)四
下一篇: C++学习笔记(Thinking in C++)六
libaohan
博客等级 码龄19年 42粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值