虚函数:

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

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

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

下面我们来看一段代码:

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. JavaScript Math(数学对象)

    Math(数学对象) Math 算术函数和常量 Math.abs( ) 计算绝对值 Math.acos( ) 计算反余弦值 Math.asin( ) 计算反正弦值 Math.atan( ) 计算反正切 ...

  2. 2017-07-08( bzip2 bunzip mount)

    .bz2 压缩格式  不能压缩目录 bzip2  源文件  (不保留源文件) bzip2 -k  源文件 (保留源文件) bzip2 -d  压缩文件名  (-k保留压缩文件) bunzip  压缩文 ...

  3. RocketMQ-事务消费

    理论部分在https://www.jianshu.com/p/453c6e7ff81c中的 "三.事务消息".下面从代码层面看一下rockemq的事务消息 一.事务消费端. 从代码 ...

  4. python_求1-2+3-4+......-100的值

    求1-2+3-4+5---100 = ? 逻辑整理: -- 本质上可以转换一下,1+3+5+--+99 -(2+4+--+100) 加减部分间隔都为2,先求1+3+5+--+99的值, 再求2+4+- ...

  5. Windows核心编程&错误处理

    知识概要 (1) MAKELANGID Windows宏,用一个来主语言标识和从语言标识创建一个语言标识符 MAKELANGID(ushort usPrimaryLanguage, ushort us ...

  6. Servlet--HttpServlet类

    HttpServlet类 定义 public class HttpServlet extends GenericServlet implements Serializable 这是一个抽象类,用来简化 ...

  7. JAVA中科学计数法转换普通计数法

    今天发现数据库里汇总的数据有点大,一输出就被自动转化成科学计数法了.后来发现是转换字符串的方法有问题.如下: String a = "11234567.89"; BigDecima ...

  8. 使用TransactionScope做分布式事务协调

    //场景是使用在多个数据库之间的协调,.NET 2.0使用一个新的类型 TransactionScope来进行协调,这与之前的COM+协调是相对来说更加方便的 //需要引用一个新的程序集:System ...

  9. android adapter 中添加OnClickListener事件

    public class SearchAutoAdapter extends BaseAdapter { private OnClickListener mOnClickListener; publi ...

  10. 【sed & awk 第二版笔记】以州和人名排列_P38

    [root@nhserver1 02]# cat listJohn Daggett, 341 King Road, Plymouth MAAlice Ford, 22 East Broadday, R ...