C++ Tips(1): Regarding Inheritance

BOOST源码笔记(2) - boost::thread之内部干将interrupt_wait     BOOST的Thread库博大精深,有很多的多线程概念在里面,今天就对其中很多call都用到的interrupt_wait的实现进行解释。首先,在BOOST文档中,有1个不得不看的概念,如下:Predefined Interruption Points The following functions are interruption points, which will throw 阅读详情

今天起开始总结一些C++中的Tip, 首先开始的是继承.

1. 我们知道在c++中,父类中的私有函数在子类中是不可见, 这的确是正确的. 但是这个却对于virtual的方法无效.

如下所示, 尽管在父类中P1,P2是私有的,但是在子类中依然可以重写这2个virtual的方法. 并且可以在子类中扩大重写方法的可见性.

下面的代码描述了template design pattern, 定义一个骨架, 并且在子类中将细节的小片方法重写达到动态的目的, 同样也可保证virtual的可见性,将不能被直接访问到.

 

 

由上可知,尽量将virtual函数放在private里,这样能避免virtual函数有多重意义 - 既作为可用户不同实现的点和接口

 

2. 继承中的隐藏

在继承结构中, 子类的同名函数定义会将父类的对应函数覆盖掉,而不管是否参数一致.

来看个例子:

当子类定义了个同名的函数f(char)时, 在子类的对象上调用f方法时(父类的对象无此烦恼),会将父类的同名方法屏蔽掉,而不管它是不是最适合的函数. 解决方法是可以加入using base:func语句使得它可见. 当此方法是virtual方法, 结果是一样的, 要特别小心. 以下是一种解决方法:

 

 

3. 在父类构造或者析构函数中调用virtual函数, 并且在子类中重写了这个方法. 则在子类的对象中调用时是指向父类的方法还是子类的, 同时this 指针(包括typeid)在那时是父类的还是子类的?

来看段代码:

 

由上可见, 即使是在子类的对象上调用, 并没有发生我们预想的动态绑定, 也就是说调用的还是父类的方法,同时this指针在那时也是指向父类的.

为什么会这样呢? 原因是, 想象种情况, 如果在子类的virtual函数中使用了子类中的成员, 此时在基类的构造函数中使用了这个函数, 而子类并没有构造完毕, 如果指向子类的函数的话, 结果不能预测. 为了避免这种情况, c++规定了此时只会指向父类的方法.

 

 

 

BOOST源码笔记(1) - boost::call_once boost::call_once应用及其实现 以下是一个典型的运用call_once实现一次初始化的例子:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include boost/thread/thread.h 阅读详情

相关推荐

Linux DRM驱动实战:手把手教你用drmModeSetCrtc显示纯色画面(附完整代码)

本文提供了一份完整的Linux DRM驱动实战指南,手把手教你使用drmModeSetCrtc在屏幕上显示纯色画面。文章详细解析了从打开设备、获取资源、创建帧缓冲区到最终提交画面的完整调用流程,并附带了可直接编译运行的完整代码示例,帮助开发者快速上手Linux图形底层开发。

weixin_29216353的博客 512

c++ string长度_C/C++编程日记:Tip string_view

这个tip的背景是,将字符串作为函数参数进行传递。常规方法将字符串作为函数参数进行传递,容易想到的是以下两个方法:voidTakesCharStar(constchar* s);// CvoidTakesString(conststring& s);// Old Standard C++这两种方法只能接收确定类型的字符串作为参数,否则可能需要类型转换。比如下面这两个场景:一、使用c_str...

weixin_39755003的博客 220

从零部署Stable Diffusion:本地环境搭建完整教程

本文专为“想自己跑Stable Diffusion但完全没经验”的新手设计,覆盖从硬件准备到生成第一张图的完整流程。不涉及复杂算法原理,但会讲清每个操作的“为什么”(比如为什么需要显卡?为什么要装CUDA?),帮你知其然更知其所以然。先检查硬件是否达标(显卡是核心!安装必要软件(操作系统、Python、CUDA)下载Stable Diffusion核心代码和模型解决常见报错,生成第一张图附赠模型库推荐和性能优化技巧显卡是核心:N卡+足够显存(至少6G)是本地部署的基础。CUDA是翻译。

AI算力网络与通信的博客 1292

c++基础知识(一)C++类继承关系问题

[code="c++"]在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public 继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢? 1. public 从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,子类 可以代替父类完成父类接口所声明的行为,也就是必须符合“L...

firedragonpzy 230

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 458

基于555定时器的D类功放设计:从PWM原理到无反馈电路实践

D类功放(数字功放)是一种高效率的音频放大技术,其核心原理是脉冲宽度调制(PWM)。它将输入的模拟音频信号转换为一系列高速开关的脉冲,通过控制功率开关管(如MOSFET)的通断,再经低通滤波器还原放大后的音频。相比传统AB类功放,其转换效率通常超过90%,显著降低了热能损耗。这项技术在追求高能效和小型化的现代音频设备中价值凸显,广泛应用于有源音箱、汽车音响和便携式设备。本文聚焦于一种独特的实现方案:以经典的555定时器芯片为核心,构建一个无整体负反馈的D类功放。通过剖析其PWM调制器、FET电压-电流转换级

weixin_30162121的博客 221

C++ 错题

虚函数相关class A { public: void f() { printf("A\n"); } };class B: public A { public: virtual void f() { printf("B\n"); } };int main() { A *a = new B; a->f();

master-dragon的专栏 1936

实现Win10环境下的MATLAB与虚拟机Ubuntu中的ROS的通讯的方法

   本文主要介绍如何实现Win10环境下的MATLAB与虚拟机Ubuntu中的ROS的通讯,虚拟机我采用的是VMware16.1.1中安装了Ubuntu20.04,并安装ROS Noetic 版本    一、虚拟机Ubuntu中配置    1、在ubuntu终端输入以下命令查看本机地址 ifconfig    如下图所示我目前的IP是192.168.3.128    2、将本机IP写入到.bashrc文件    打开home文件夹,按Ctrl+h显示隐藏的文件,选择.bashrc并打开(

慕羽★的博客 7517

腾讯2017校招开发工程师几道看代码的题

请指出下列代表有几处错误。 #include<stdio.h> class A { public: virtual void f(){} public : A() { f(); } }; class B1:public A()#########错误1:class B1:public A { ...

summer2day的博客 411

torch_npu 用法笔记

torch_npu 用法笔记

jacke121的专栏 1536

肖特基二极管选型参数,结构原理,工艺与注意问题总结

肖特基二极管(Schottky Diode)是一种特殊的二极管,也被称为肖特基势垒二极管。它是利用金属与半导体接触形成的金属-半导体结原理制成的。与传统的PN结二极管相比,肖特基二极管具有更低的正向压降、更高的开关速度、更高的反向恢复时间以及更好的温度稳定性等特点。本文对肖特基二极管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 812

面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析

如果C同时派生了基类A和基类B,那么C的对象的内存是如何分布的呢?基类指针pa和基类指针pb对这块派生类C对象的内存所存储的内容又做和解析?或者说pa和pb指向的地址是否是C对象的首地址呢? 1.继承是按照类为整体进行组织的,且如果有继承虚函数,那么将有多余的一个虚函数表指针。 2.基类指针指向派生类后,同样是按照指针强制转化原则来解析派生类对象的部分区块内容(指针截断) 3.多继承中,各个基类的指针指向派生类后,各自基类指针指向的是派生类中与本身基类相关的派生类区块首地址。

ordeder的专栏 4516

分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)

分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 778

BOOST源码笔记(5) - 最小的代价实现同步-无锁编程,看boost中的interlocked_bit_test_and_set实现

如题,如何用最小的代价来实现同步呢,即无锁编程(主要是使用原子操作替代锁来实现对共享资源的访问保护),我们来看看下面的代码。首先,我们需要是在这个函数内部对地址x中的值进行位测试并将其对应的位置位。  这里的关键是我们必须先读出*x的值,作位或运算之后,将得到的值对*x赋值。而在多线程环境中,在读出*x后也许有另外的线程对*x进行写操作,这样在给*x赋值的时候就会把对旧的值位或的结果赋给*

daeees的专栏 4245

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

BOOST源码笔记(3) - 节省内存的小技巧

 先不多说,来看段代码: struct state_data        {            unsigned shared_count:11,                shared_waiting:11,                exclusive:1,                upgrade:1,                exclusive_wait

daeees的专栏 1435

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Tip: 如何保证一个类只能在堆上被创建

<br />有的时候为了保证一个类的对象必须在堆上被创建, 比如当我们需要手动控制一个对象的生命周期的时候, 这个时候就必须保证这个对象是在堆上创建的, 如何保证呢, 有个小的技巧:<br /> <br />class A <br />{<br />public:<br />    void Close() {delete this; }<br />private:<br />    ~A() { ... };<br />};<br /> <br />int main()<br />{<br />    A

daeees的专栏 1105

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Google C++ Convention

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#The__define_GuardGist: 头文件:#define: ___H_. #include: 当forward declaration(for example: class A;) 够用时别再用#include了 在没有类定义的情况下(For example, only declare class Foo), 依然可用的有: 数据成员是Foo* or Foo&函数的参

daeees的专栏 1014

STL源码剖析 -- STL Alloc 的allocate和construct

STL 中的allocate调用了::operator new() -----此函数不会调用construct;同理deallocate。 而new 或者 delete则编译器会自动算出size_t 和 void *p并传给::operator new及::operator delete,然后调用construct及deconstruct 一句话::operator new/::o

daeees的专栏 987

BOOST源码笔记(6) - 无安全保证的随意转换~~~force_cast

从下面代码可以知道,用reinterpret_cast将一种类型的指针转到另外一种类型的指针是不会出现任何错误的,但是仅仅是编辑器的错误哈哈。另外,注意用引用传参,节省copy 时间么。  // general casetemplateinline Return_Type &force_cast(Argument_Type &rSrc){    return(*reinterpret_

daeees的专栏 977

STL源码剖析 -- 看copy的重叠区间拷贝

 在STL中,copy函数被多次重载过,当然是为了效率: 而在针对内建类型的特化版本会采用memove(), 而memove会将整个输入区别先copy下来,再进行copy,这样就不会有重叠区间copy覆盖的问题,而其他的版本的copy则要小心这个问题。

daeees的专栏 800

可以做non-type tamplate argument 的类型

<br /> 直接上例子:<br /> <br />    template <bool> <br />    struct StaticCheck { StaticCheck(...);}; <br />    template <> <br />    struct StaticCheck<false> {}; <br /> <br />    bool f =false;<br />    StaticCheck<f>();<br /> <br />报错: Error 1 error C2971: '

daeees的专栏 766

SmallObjectAllocator实作

#ifndef _ALLOC_H_#define _ALLOC_H_#pragma once#include #include "Assert.h"#ifndef NULL#define NULL 0#endifnamespace KOK{    class __CSimpleAlloc    {    public:        static void* Allocate(size

daeees的专栏 741

C++ Tips(2): Regarding Const

<br />今天的内容是const. 有几点不得不说:const是compile-time的,不影响runtime.所以不会影响效率对于传参数中用到const,  在值类型时不需要使用, 因为值类型始终会有个拷贝,所以加了const也没用, 只需要在传指针和引用时使用.在const的对象上只能调用const的成员方法.const会加入方法的重载决议, 所以可以针对const的版本进行重载.int*隐式转const int*允许, 而const int* 隐式转int*不允许const指针仅仅保证无法通过这个

daeees的专栏 684

SmartPtr实作

#ifndef _KOK_SMARTPTR_H_#define _KOK_SMARTPTR_H_#pragma once#include #include #include namespace KOK{    template    class CheckAssert    {    protected:        void OnRef(const P& pointer)     

daeees的专栏 670
上一篇: (转)内存映射文件分析
下一篇: C++ Tips(2): Regarding Const
daeees
博客等级 码龄19年 6粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值