多态


C++的封装、继承和多态三大特性,封装没什么好说的,就是把事务属性和操作抽象成为类,在用类去实例化对象,从而对象可以使用操作/管理使用它的属性。

至于继承,和多态密不可分。基类可以进行派生,而派生类则是继承基类或称父类,把基类中属性和方法拿过来,变成自己的一部分,其中需要较为精细的思考。

多态则是一种实现多种使用的手法,这样的说法不太准确。静态多态(编译时多态)我觉得是函数重载,不再赘述了,要注意的是重载函数的二义性(PS.Tencent interview TEG)。动态多态/运行时多态,又称动态绑定。动态绑定的基础是虚函数和使用基类指针或引用调用基类函数,只要用virtual声明了虚函数,那么它的调用对象就要运行时才能确定。它的实现机制在《深度探索对象模型》中有较为晦涩的解释。

基类指针或是引用调用虚函数会发生运行时绑定,但是非虚函数则不会,还是编译时绑定,它的动态类型和静态类型是一致的。

纯虚与抽象


虚函数声明尾连接 “= 0” 是的该该虚函数成为纯虚函数,作为接口,供派生类覆盖实现。

含有纯虚函数的类是抽象类,不能进行实例化,只能作为基类供子类继承以实现声明的纯虚函数。

(实例化抽象类的错误信息)

一个例子

 #include <iostream>
using namespace std; //抽象基类
class abstract
{
protected:
int m;
public:
string name;
public:
abstract() = default;
~abstract() = default;
virtual void set(string _name) = ;
virtual string get() const = ;
}; //派生类
class Son : public abstract
{
private:
int count;
public:
Son() = default;
~Son() = default;
void set(string _name) override;
string get() const override;
}; void Son::set(string _name)
{
this->name = _name;
this->count = ;
this->m = ;
} string Son::get() const
{
return this->name + to_string(this->m);
} int main()
{
Son s;
s.set("yoci");
cout << s.get() << endl; return ;
}

访问控制


private:仅类内可见,其他不可见;

protected : 类内可见,派生类可见;

public:都可访问。

基类虚析构


一般我们把基类的析构函数设置成为虚函数,且采用默认实现的版本。

是为了避免,使用动态绑定时,基类指针指向派生类对象并进行析构时,采用(静态类型)基类析构函数而出现错误的情况


C++ 虚函数相关的更多相关文章

  1. C++ 虚函数相关,从头到尾捋一遍

    众所周知,C++虚函数是一大难点,也是面试过程中必考部分.此次,从虚函数的相关概念.虚函数表.纯虚函数.再到虚继承等等跟虚函数相关部分,做一个比较细致的整理和复习. 虚函数 OOP的核心思想是多态性( ...

  2. C++虚函数相关内容

    样例代码 class Base{public: Base(){}; virtual ~Base(){    //若没有设置为虚函数:如果有这样的指针Base *p=new Derived();声明,则 ...

  3. cocos2d-x 运行时xcode提示错误:"vtable for XXX", referenced from 问题已解决;

    vtable/引用和虚函数相关,今天在添加一个层的时候报了这个错误,很低级的错误,忘了实现虚函数了(谨记!!) 若如果实现了虚函数还依然如此的话,可能是创建的时候忘了钩上 -desktop 选项了,把 ...

  4. 面试相关-转载-well,yzl——持续更新

    转载yl,yzl大神的面经,顺便自己复习一下专业课的内容 操作系统相关: 什么是进程, 什么是线程.它们之间的区别和联系. 进程管理内存资源+运行过程, 线程只管理运行过程, 线程要在进程提供的资源基 ...

  5. (已解决)cocos2d-x 运行时xcode提示错误:"vtable for XXX", referenced from;

    vtable/引用和虚函数相关,今天在添加一个层的时候报了这个错误,很低级的错误,忘了实现虚函数了(谨记!!) 若如果实现了虚函数还依然如此的话,可能是创建的时候忘了钩上 -desktop 选项了,把 ...

  6. 编写高质量代码_改善C++程序的150个建议 读书笔记

    这几天看了下这本书<编写高质量代码_改善C++程序的150个建议>,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习. 编写符合标准的main函数 C语言标准规定了main函数的 ...

  7. C++面试高频题

    作者:守望者1028链接:https://www.nowcoder.com/discuss/55353来源:牛客网 面试高频题: 校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我也忘记了 ...

  8. C++类大小的计算

    这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指 ...

  9. C++中的多重继承(二)

    1,本文分析另一个多重继承问题及其工程中的解决方案,单继承加多接口实现的开发方式: 2,多重继承的问题三: 1,多重继承可能产生多个虚函数表: 1,实际工程中可能造成不可思议的问题,并且这些问题很难以 ...

随机推荐

  1. OVS+VXLAN实现两个宿主机上的VM间的通信

    一.组网图 说明: 1.使用网络命名空间表示vm1和vm2. 因为我没有两台物理服务器. 2.使用virtualbox 的两条虚机模拟作为host1和host2. 二.配置指导 1.创建网桥 br0 ...

  2. (十)java虚拟机性能监控工具

    一. jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息.语法格式如下: 命令行参数选项说明如下: 1.1 案例 ...

  3. git命令手册

    以下内容是我在学习和研究Git时,对Git操作的特性.重点和注意事项的提取.精练和总结,可以做为Git操作的字典,方便大家查阅: 备注:本文会不断更新完善: 目录 一. 语法格式描述 二. git环境 ...

  4. python 函数、参数及参数解构

    函数 数学定义 y=f(x), y是x函数,x是自变量.y=f(x0,x1...xn) Python函数 由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单位 完成一定的功能 函数作 ...

  5. JsonSchema用法

    JsonSchema用法 简介 JSON Schema是基于JSON格式,用于定义JSON数据结构以及校验JSON数据内容.JSON Schema官网地址:http://json-schema.org ...

  6. eNSP——OSPF的基础配置

    原理: 模拟实验: 拓扑图: 实验编址: 1.基本配置 根据实验编址和拓扑图进行基本配置,并测试连通性. 2.部署OSPF网络 首先使用ospf命令创建并运行OSPF,1代表进程号 接着使用area命 ...

  7. VMware中 CentOs虚拟机的安装教程

    首先点击创建新的虚拟机 选择典型安装,点击下一步 这里我们选择稍后安装操作系统,然后点击下一步 这里我们操作系统选择Linux操作系统,版本选择CentOs 7 64位,然后点击下一步 这里我们可以修 ...

  8. uwp,c#,全屏播放保持屏幕响应

    在开发视频app的时候,全屏播放一段时间内没有电脑操作,电脑会自动进入睡眠模式,这时就要多写些代码来保持响应了. (这里使用的是MediaElement播放控件,MediaElement需要手动添加代 ...

  9. ROS学习(一)Ros 中使用kinect

    上的安装说明如下: 官网上明确写了如果安装windows kinect还需要安装一个驱动,但是有些ROS的书上并没有这么做,只提到了使用如下两步进行安装即可使用: sudo apt-get insta ...

  10. Google 安装 Elasticsearch-head 插件

    下载插件:https://github.com/liufengji/es-head 安装插件: google --->更多工具---->扩展程序 将解压的elasticsearch-hea ...