虚函数:

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

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

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

下面我们来看一段代码:

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. 嵌入式QT移植

    1  开发环境 目标版:FS4412(Cortex-A9)开发板 交叉工具链:arm-linux-gcc 4.6.4 版本 Qt:qt-everywhere-opensource-src-5.4.2. ...

  2. python_面向对象

    什么是面向对象? -- 一种主流编程范式,编程思维框架,世界主流两个方向,面向对象和面向过程. --  面向是把关注点集中一个具体东西,比如看向手机,也叫面向手机,手机就是一个对象,我们 把手机的属性 ...

  3. Django简介--Django从入门到精通系列教程

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

  4. Asp.net core 2.0.1 Razor 的使用学习笔记(四)

    ASP.net core 2.0.1 中 asp.net identity 2.0.1 的基本使用(三)—用户注册 一.修改用户注册 1.打开Pages文件夹>Account>Regist ...

  5. PHP中变量的销毁

    PHP的变量或对象的销毁可以分成显式销毁和隐式销毁: 1.显式销毁,当对象没有被引用时就会被销毁,所以我们可以unset或为其赋值NULL; 2.隐式销毁,PHP是脚本语言,在代码执行完最后一行时,所 ...

  6. mac对比class文件

    下载反编译工具 wget https://varaneckas.com/jad/jad158g.mac.intel.zip 设置Beyond Compare 填写编译工具路径

  7. SpringMVC源码之Controller查找原理

    摘要 本文从源码层面简单讲解SpringMVC的处理器映射环节,也就是查找Controller详细过程. SpringMVC请求流程 Controller查找在上图中对应的步骤1至2的过程 Sprin ...

  8. CSS核心内容之浮动

    1.浮动涉及到左浮动,右浮动,清除浮动. 2.浮点的特点: 1.向指定的方向浮动,并且让出空间 2.如果后面的元素也是浮动的,那么后面的元素就会在碰到前面的浮动的元素或者边框时,就定位在那里 3.如果 ...

  9. Jmeter Smock Test规范设计

    Jmeter Smock Test规范设计 一.Smock Test物料 1.开发运行工具Jmeter,(下载地址: http://jmeter.apache.org/download_jmeter. ...

  10. vue打包后不使用服务器直接访问方法

    根据官网打包执行npm run build 后dist文件夹打开的index.html 是空白 需要开启http服务器才能访问,以下是解决办法 1.找到config文件夹下的index文件 修改成 2 ...