重拾C++之虚函数和虚基类以及抽象类
为什么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++之虚函数和虚基类以及抽象类相关推荐
- c++------------之---【虚函数和抽象基类的应用】
/*************************************************************************************************** ...
- python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类
纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...
- C++虚函数和虚函数表原理
虚函数的地址存放于虚函数表之中.运行期多态就是通过虚函数和虚函数表实现的. 类的对象内部会有指向类内部的虚表地址的指针.通过这个指针调用虚函数. 虚函数的调用会被编译器转换为对虚函数表的访问: ptr ...
- 【C++】多态(早期绑定、后期绑定)、抽象类(纯虚函数)、虚析构函数
我们都知道面向对象编程的三大特征是封装.继承.多态,今天我们就来说一下其中之一的多态. 概念: 多态: 多态字面意思就是多种形态,C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同 ...
- C++中虚函数、虚指针和虚表详解
关于虚函数的背景知识 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类的对象都有一个指向虚表开始的虚指针.虚表是和类对应的 ...
- 虚函数、纯虚函数、虚函数与析构函数
一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个 ...
- 【转载】什么是C++虚函数、虚函数的作用和使用方法
我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能 ...
- c++虚函数和虚函数表
前言 (1)虚基表与虚函数表是两个完全不同的概念 虚基表用来解决继承的二义性(虚基类可以解决). 虚函数用来实现泛型编程,运行时多态. (2)虚函数是在基类普通函数前加virtual关键字,是实现多态 ...
- 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员 ...
- python虚函数_虚函数和纯虚函数的区别
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
最新文章
- IOT/智能设备日志解决方案(1):概述
- 北斗导航 | 北斗卫星导航信号串行捕获算法MATLAB仿真(附源代码)
- linux 生成随机数命令
- android 查看多个图片,一分钟实现Android多张图片选择
- 成功驱动HD4600-Clover引导
- winrar3.80注册码
- C语言练习:hackerrank十五关
- 验证性因素分析AVE和CR值
- 使用maven为web工程引入jstl包时报错
- css3箭头水平淡入淡出
- 知乎APP 产品分析
- 采集工具助力企业拓客,让你的业务快速扩张
- mac使用mysql出现的错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- FFmpeg 使用命令整理 – 提取音频或视频、提取图片、格式转换等
- 抢票(python)
- img 的 alt 与 title 的异同,还有实现图片懒加载的原理
- 使用TKMapper主键的坑
- Unity Accelerator本地服务器加速Unity项目资源载入速度
- 8-Arm-PEG2000-EP,含有环氧基的多臂PEG,8-Arm PEG2000-Epoxide
- VS调试状态下断点总是进不去,不能进断点调试解决办法
热门文章
- nowcoder猜想c语言筛子,剑指 Offer 50 道经典算法题视频讲解
- python如何设置双索引_python-在新的多索引下串联熊猫列
- 【知识图谱系列】多关系异质图神经网络CompGCN
- struts1、 struts2所有版本jar包下载地址大全
- 写“博客”页面踩过的坑
- 最新基于高德地图的android进阶开发(6)感兴趣点(POI)周边搜索源码浅析
- 信息安全收集注意事项
- Raki的读paper小记:Sources of Transfer in Multilingual Named Entity Recognition
- 光盘文件导入服务器,web服务器 光盘文件
- 依据BaiduHack多线程爬取攻击点url和网站url,保存至txt