虚函数:

在程序运行过程中调用函数名相同的函数而实现不同功能的函数

利用虚函数这一特性,我们可以在公有继承的基类(父类)中定义虚函数,而在它们的派生类(子类)中通过基类指针来实现派生类中同名函数的调用

在派生类中定义的同名函数必须是参数类型,顺序,参数的个数以及返回值都相同,否则就成了函数重载

下面我们来看一段代码:

class point//基类
{
float x,y;
public:
point(){}
point(float i,float j){x=i;y=j;}
virtual float arear(void){return 0.0;}
//声明基类中的arear函数为虚函数,使得其在派生类和基类同名函数中有一个统一的接口,
//根据其指向的类来判断其通往哪一个接口
};
const float Pi=3.14159;//定义一个常量

在基类中定义了一个名叫arear返回值为浮点数且没有参数的虚函数

接下来定义了一个公有继承的派生类Cricle

class Cricle:public point//公有继承的派生类
{
float radius;
public:
Cricle(float r){radius=r;}
float arear(void){return Pi*radius*radius;} };

该派生类公有部分也定义了一个名字叫arear返回值为浮点数,没有参数的同名函数

到主函数的实现部分

int main()
{
point *p ,a;
Cricle c1();
p=&a; //调用基类公有函数
cout<<p->arear()<<endl;
p=&c1;//调用派生类的公有函数
cout<<p->arear()<<endl;
//如果没有声明基类的一个对象a则无法通过指针p来调用基类的公有函数
return ;
}

声明了一个基类的指针和一个point类的对象a

从上面我们可以看出当指针指向基类对象a时,通过指针调用的同名函数就为基类中的函数

当指针指向派生类对象c1时,调用的函数则是派生类中的函数

通过以上例子不难看出,利用vitual虚函数,我们可以在同名函数的调用上实现不同的功能,也就实现了我们所说的多态性

似乎在保护继承和私有继承时候不能通过基类指针对派生类函数进行访问,原因是因为此时,基类数据在派生类中相对外部是不可引用的

  

class C:protected virtual A
 C c1(,,,,);
p=&c1;
p->show();

它会报错说不能通过A来调用C中函数

error: 'A' is an inaccessible base of 'C'

利用vitual构造类的动态多态性的更多相关文章

  1. C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...

  2. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  3. Python动态构造类:借助强悍的内建 type()

    内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下: type(name, bases, dict) 返回一个新的type对象. 基本上是 class 语句的动态形式. 参数: ...

  4. C++ 类的动态组件化技术

    序言: N年前,我们曾在软件开发上出现了这样的困惑,用VC开发COM组件过于复杂,用VB开发COM组件发现效率低,而且不能实现面向对象的很多特性,例如,继承,多态等.更况且如何快速封装利用历史遗留的大 ...

  5. C#动态多态性的理解

    C#动态多态性是通过抽象类和虚方法实现的. 抽象类的理解 用关键字abstract创建抽象类,用于提供接口的部分类的实现(理解:接口不能提供实现,抽象类中可以有实现,接口与抽象类一起使用,可以达到父类 ...

  6. 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和  ...

  7. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  8. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  9. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

随机推荐

  1. python_如何对实例属性进行类型检查?

    案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查 p = Person() p.name = 'xi_xi'         # 必须是str p.age = ...

  2. 译-what is cmdlet

    A cmdlet (pronounced "command-let") is a lightweight Windows PowerShell script that perfor ...

  3. Part 2:模型与后台管理admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  4. Nginx几种负载均衡算法及配置实例

    本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...

  5. centos7添加图像化桌面并设置中文

    我前面是使用的centos6.最近才最小化安装了一个centos7.4(最小化安装有很多命令都没有,所以不建议这样干).完了装了图形化界面和设置中文,感觉和centos6有些区别,所以记录一下过程. ...

  6. bat自动打包压缩实现

    1.引言 本文档的编辑目的是为了实bat脚本自动打包功能,包含包的名字命名,压缩文件内外层文件夹的名字:包含svn版本号等: 2.实现介绍 (1)获取svn号,生成批处理文件 写一个pak.bat文件 ...

  7. 单元测试系列:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  8. 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(二)

    经典网络 LeNet-5 AlexNet VGG Ng介绍了上述三个在计算机视觉中的经典网络.网络深度逐渐增加,训练的参数数量也骤增.AlexNet大约6000万参数,VGG大约上亿参数. 从中我们可 ...

  9. Hive on ES

    ES对于类似数据库的SQL查询很无力,可以使用Hive on ES来实现SQL的查询.2个百万级的索引做关联时,需要大概1分多钟,基于es2.1版本. 1.将elasticsearch-hadoop- ...

  10. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...