虚函数:

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

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

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

下面我们来看一段代码:

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. es6重点笔记:let,const

    一,let 先看代码: var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i) }; } a ...

  2. CentOs下安装PHP扩展curl

    服务器运行一段时间后,可能突然会需求添加某个扩展,如curl.pdo.xmlrpc等,这就需要在不重新编译Linux PHP的情况下独立添加扩展. 1.安装crul wget http://curl. ...

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

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

  4. java编程中常用英语单词

    JAVA 省略语与名词解释 -------------------------------- J2EETM----JavaTM 2PlatformEnterpriseEdition : J2EE(JA ...

  5. 从零认识Java Package

    Java Package为何被设计?如果你没想过,我这里或许可以提供一种视角. 想象一下,作为一个语言的设计者,你一定会考虑一个问题:变量名的冲突.为了解决这个问题,C++引入了命名空间(namesp ...

  6. 02_HTML5+CSS详解第四天

    依旧是CSS部分贴个CSS主要知识点总结的链接:http://blog.csdn.net/html5_/article/details/26098273 [自己的笔记做得好乱,以前一直以为是字丑的原因 ...

  7. Cacti在selinux开启的情况下使用

    # chcon -R -t httpd_sys_content_t /var/www/html/cacti

  8. docker挂载NVIDIA显卡运行pytorch

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃   写在前面: 请参考之前的文章安装好CentOS.NVIDIA相关驱动及软件.docker及 ...

  9. js中的语句

    java语句与js的语句一样.1.判断if else/switch <script type=text/javascript> function fun1(){ var num = 10; ...

  10. JAVA泛型使用方法总结

    1. 基本概念: (1)什么是泛型? 泛型,即"参数化类型".即将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用或 ...