1.直接看下列代码:

#include <iostream>
using namespace std;
class base{
public:
void who(){
cout<<"this is the class of base!"<<endl;
}
};
class derivel1:public base{
public:
void who(){ //一般的重载函数
cout<<"this is the class of derivel1!"<<endl;
} };
class derivel2:public base{
public:
void who(){
cout<<"this is the class of derivel2!"<<endl;
} };
int main(){
base obj1,*p;
derivel1 obj2;
derivel2 obj3;
p=&obj1;
p->who();
p=&obj2;
p->who();
((derivel1*)p)->who();
p=&obj3;
p->who();
((derivel2*)p)->who();
obj2.who();
obj3.who(); return ;
}

这就引入了为什么要引入虚函数的概念——————为了实现多态性

2.对于虚函数在内存中的分布,看一下博客即可深刻体会:

http://blog.csdn.net/zhangliang_218/article/details/5544802

ps:注意虚函数和重载函数的关系

ps:注意与java多态的区别

3.在构造函数和析构函数中调用虚函数

编译系统对构造函数和析构函数中调用虚函数采用静态联编,即它们所调用的虚函数是自己的类或者基类中定义的函数而不是在任何派生类中重定义的函数。

  例子如下:

#include <iostream>
using namespace std;
class base{
public:
base(){
}
virtual void vf(){
cout<<"base::vf() called"<<endl;
}
};
class son:public base{
public:
son(){
vf();
}
void g(){
vf();
}
};
class grandson:public son{
public:
grandson(){ }
void vf(){
cout<<"grandson::vf() called\n";
}
};
int main(){
grandson gs;
gs.g();
return ;
}

结果如下:

程序出现这样的运行结果是因为在建立grandson类的对象gs时,它所包含的基类子对象在派生类中定义的新成员建立之前就被建立。

4.空的虚函数

  派生类并不一定必须实现基类中的虚函数,如果派生类想通过虚函数机制访问虚函数,则必须建立一条从基类到派生类的虚函数路径。

#include <iostream>
using namespace std;
class base{
public:
virtual void print(){
cout<<"class base\n";
}
};
class son:public base{
public:
virtual void print(){ //空虚函数
}
};
class grandson:public son{
public:
virtual void print(){
cout<<"class grandson!\n";
}
};
void show(base *p){
p->print();
}
int main(){
base *pbase=new base;
son *pson=new son;
grandson *pgrandson=new grandson;
show(pbase);
show(pson);
show(pgrandson); return ;
}

  运行结果:

5.纯虚函数和抽象类

c++中虚函数和多态性的更多相关文章

  1. C++中虚函数的作用浅析

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  2. c++ 继承 虚函数与多态性 重载 覆盖 隐藏

    http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...

  3. C++中虚函数的作用是什么?它应该怎么用呢?(转)

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  4. c++中虚函数

    虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难.我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术.说明一点 ...

  5. C++中虚函数的作用和虚函数的工作原理

    1 C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数:虚函数的作用:多态性:多态公有继承:动态联编 C++中的虚函数的作用主要是实现了多态的机制.基类定义虚函数,子类可以重写该函数 ...

  6. <转>C++继承中虚函数的使用

      转自:http://blog.csdn.net/itolfn/article/details/7412364 一:继承中的指针问题. 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对 ...

  7. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

  8. C++中虚函数功能的实现机制

    要理解C++中虚函数是如何工作的,需要回答四个问题. 1.  什么是虚函数. 虚函数由于必须是在类中声明的函数,因此又称为虚方法.所有以virtual修饰符开始的成员函数都成为虚方法.此时注意是vir ...

  9. C++中虚函数的动态绑定和多态性

    目录 静态类型 vs 动态类型.静态绑定 vs 动态绑定 虚函数动态绑定实现机制.虚析构函数 多态性 一.静态 vs 动态 静态类型 VS 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态 ...

随机推荐

  1. 顺序队列(C语言)

    #define Queue_MAX_SIZE 20 #define OK 1 #define ERROR 0 #include <stdio.h> #include <stdlib. ...

  2. 渗透测试的理论部分2——OSSTMM的详细描述

    昨天休息了一天,今天我要连更两篇博客,作为补充,以下为正文 本章详细描述了OSSTMM内的RAV得分这一理论概念,对日后从事正规安全工作至关重要 OSSTMM为开源安全测试方法论,对OSSTMM不了解 ...

  3. FastJSON基础

    对象的类型 json文本 json数组 json对象 java对象 类型的转换 json文本      转   json对象      JSON.parseObject(str) json文本     ...

  4. numpy版本查看以及升降

     如题,参考:https://zhuanlan.zhihu.com/p/29026597 pip show numpy 查看numpy版本; pip install -U numpy==1.12.0, ...

  5. VS中编译出现——计算机中丢失XINPUT1_4.dll解决办法

    如果用DX SDK 2010的版本,编译时可能就会出现这种问题. 解决办法,在链接库时把XInput.lib换成XINPUT9_1_0.LIB,重新编译就可以了. 用老操作系统 + 老DX SDK + ...

  6. R语言csv与txt文本读入区分(sep参数)

    R语言csv与txt文本读入区分 R语言用来处理数据很方便,而处理数据的第一步是把数据读入内存空间,平时最常用的文本数据储存格式有两种: 一种是CSV(逗号分隔符文本)另一种是TXT(Tab分隔符或空 ...

  7. pdf预览(pdf.js)

    开门见山,pdf.js是Mozilla(缩写MF或MoFo)全称Mozilla基金会,下面的插件.现在社区非常活跃. Mozilla是为支持和领导开源的Mozilla项目而设立的一个非营利组织 下载地 ...

  8. 微服务应用新趋势:Service Mesh、AIOps和中台化

    微服务技术由于天生支持快速迭代.弹性扩展的特点,使企业能够在不确定性下提升发展速度及抗风险能力,受到了越来越多的关注.当前,云服务商纷纷试水微服务产品,最为典型的,当属推出轻舟微服务平台.剑指整个微服 ...

  9. docker 安装 RabbitMQ

    1.镜像中国(http://www.docker-cn.com/registry-mirror):直接使用https://hub.docker.com下载镜像比较慢,使用镜像中国加速 使用例子:$ d ...

  10. 8:String类

    String类 String类的特点: 字符串对象一旦被初始化就不会被改变. 字符串是最常用的类型之一,所以为了使用方便java就给封装成了对象方便使用  public static void str ...