为什么80%的码农都做不了架构师?>>>   

一、引言

好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了。

声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了
class A{...}a=A();//尼玛这都能行,被踢大了
二、虚函数和一般函数

虚函数就是加了vritual关键字的函数,引入虚函数的目的是为了实现多态性(在此为运行时的多态性),即可以通过父类的指针调用子类的对象,从而产生不同的效果。

    virtual void show(){cout<<"hello my name is a"<<endl;}

废话不多说,为了展示虚函数和一般函数的区别看看下面一个个例子:

#include<iostream>
using namespace std;class A{
private:int a;int b;
public:A(int a,int b){this->a=a;this->b=b;cout<<"hello base A"<<endl;cout<<a<<'-'<<b<<endl;}//定义一个虚函数virtual void show(){cout<<"hello my name is a"<<endl;}
};
class D:public A{
public:D(int a,int b):A(a,b){cout<<"hello base A"<<endl;cout<<a<<'-'<<b<<endl;}void show(){cout<<"hello my name is d"<<endl;}
};
class E:public A{
public:E(int a,int b):A(a,b){cout<<"hello base A"<<endl;cout<<a<<'-'<<b<<endl;}void show(){cout<<"hello my name is e"<<endl;}
};
int main()
{A *p;D d = D(1,2);p=&d;p->show();E e = E(1,2);p=&e;p->show();
}

编译,运行输出中有这么两行:

hello my name is d
hello my name is e

然后去掉关键字vritual,在编译运行,上面两行变成了

hello my name is a
hello my name is a

看到区别了吧!对于普通函数,虽然父类的指针指向了子类的对象,但是调用的仍然是父类的函数,而虚函数则是执行子类中新定义的函数。

三、虚函数和纯虚函数

学过java的都知道有类和接口两种不一样的东西(其实我在装逼,java也就会i++了.*_*!!),纯虚函数就类似于接口,纯虚函数不能在定义类中实现,但应该在能够实例化的子类中实现。定义了纯虚函数的类就要抽象类(记住是抽象类不是虚基类,网上有个逼说是虚基类,此贴居然还有好多人转发,真是害人不浅。好吧也许真是虚基类,那就当我是逼吧^_^)。抽象类不能够被实例化。

四、虚继承和虚基类

虚继承的主要是为了解决多重继承中出现的二义性问题,普通继承如果一个基类通过几条路径继承到了一个派生类中,那么这个派生类将有两个基类的副本,对这些成员的访问将会出现二义性错误。

//虚继承是这样的
class A :public vritual B{
....
}

虚基类:虚基类是指虚继承中的基类,记住不是含有纯虚函数的类(抽象类)

注意:对于虚基类的初始化即使是是间接继承,在派生类的构造函数中也应该显示的调用其构造函数,否则将调用默认的构造函数(没有参数,如果没有定义自己的构造函数,系统将会定义默认的构造函数,否则没有默认构造函数),如果没有默认构造函数,程序将会出错。

五、总结

虚函数是为了实现多态性,虚基类是为了解决多重继承的二义性问题,除此之外似乎没有任何关系(唯一有关系也是虚的,所以有关系是假的)。

虚基类是虚继承中的基类,抽象类是含有纯虚函数的类,两者完全不同。

转载于:https://my.oschina.net/flylxl/blog/524965

重拾C++之虚函数和虚基类以及抽象类相关推荐

  1. c++------------之---【虚函数和抽象基类的应用】

    /*************************************************************************************************** ...

  2. python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类

    纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...

  3. C++虚函数和虚函数表原理

    虚函数的地址存放于虚函数表之中.运行期多态就是通过虚函数和虚函数表实现的. 类的对象内部会有指向类内部的虚表地址的指针.通过这个指针调用虚函数. 虚函数的调用会被编译器转换为对虚函数表的访问: ptr ...

  4. 【C++】多态(早期绑定、后期绑定)、抽象类(纯虚函数)、虚析构函数

    我们都知道面向对象编程的三大特征是封装.继承.多态,今天我们就来说一下其中之一的多态. 概念: 多态: 多态字面意思就是多种形态,C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同 ...

  5. C++中虚函数、虚指针和虚表详解

    关于虚函数的背景知识 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类的对象都有一个指向虚表开始的虚指针.虚表是和类对应的 ...

  6. 虚函数、纯虚函数、虚函数与析构函数

    一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个 ...

  7. 【转载】什么是C++虚函数、虚函数的作用和使用方法

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能 ...

  8. c++虚函数和虚函数表

    前言 (1)虚基表与虚函数表是两个完全不同的概念 虚基表用来解决继承的二义性(虚基类可以解决). 虚函数用来实现泛型编程,运行时多态. (2)虚函数是在基类普通函数前加virtual关键字,是实现多态 ...

  9. 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承

    虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员             ...

  10. python虚函数_虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

最新文章

  1. IOT/智能设备日志解决方案(1):概述
  2. 北斗导航 | 北斗卫星导航信号串行捕获算法MATLAB仿真(附源代码)
  3. linux 生成随机数命令
  4. android 查看多个图片,一分钟实现Android多张图片选择
  5. 成功驱动HD4600-Clover引导
  6. winrar3.80注册码
  7. C语言练习:hackerrank十五关
  8. 验证性因素分析AVE和CR值
  9. 使用maven为web工程引入jstl包时报错
  10. css3箭头水平淡入淡出
  11. 知乎APP 产品分析
  12. 采集工具助力企业拓客,让你的业务快速扩张
  13. mac使用mysql出现的错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  14. FFmpeg 使用命令整理 – 提取音频或视频、提取图片、格式转换等
  15. 抢票(python)
  16. img 的 alt 与 title 的异同,还有实现图片懒加载的原理
  17. 使用TKMapper主键的坑
  18. Unity Accelerator本地服务器加速Unity项目资源载入速度
  19. 8-Arm-PEG2000-EP,含有环氧基的多臂PEG,8-Arm PEG2000-Epoxide
  20. VS调试状态下断点总是进不去,不能进断点调试解决办法

热门文章

  1. nowcoder猜想c语言筛子,剑指 Offer 50 道经典算法题视频讲解
  2. python如何设置双索引_python-在新的多索引下串联熊猫列
  3. 【知识图谱系列】多关系异质图神经网络CompGCN
  4. struts1、 struts2所有版本jar包下载地址大全
  5. 写“博客”页面踩过的坑
  6. 最新基于高德地图的android进阶开发(6)感兴趣点(POI)周边搜索源码浅析
  7. 信息安全收集注意事项
  8. Raki的读paper小记:Sources of Transfer in Multilingual Named Entity Recognition
  9. 光盘文件导入服务器,web服务器 光盘文件
  10. 依据BaiduHack多线程爬取攻击点url和网站url,保存至txt