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. Object.defineProperty之observe实现

    对数据对象的属性批量劫持设置: <script type="text/javascript"> function observe(data){ if(!data || ...

  2. xpath获取一个标签下的多个同级标签

    一.问题: 我在使用xpath获取文章内容的时候会遇到,多个相同的标签在同一级下面,但是我们只需要获取一部分的内容.比如我不想需要原标题这些内容. 二.解决: Xpath中有一个position()的 ...

  3. VM下载安装

    VM下载 VM是一款收费软件,要找有密钥的下载. 我的网盘 > 软件 > 常用电脑工具 > VM VM安装 参考链接中的安装步骤 http://blog.java1234.com/b ...

  4. mui 页面提示:Unable to preventDefault inside passive

    页面提示: 点击该事件:页面提示:[8mui.min.js:7 [Intervention] Unable to preventDefault inside passive event listene ...

  5. ubuntu下签名命令

    Platform: RockchipOS: Android 6.0Kernel: 3.10.92 拷贝签名文件/signapk.jar和apk到同一目录下. 签名文件:rk3288/build/tar ...

  6. 【慕课网实战】一、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    课程整套CDH相关的软件下载地址:http://archive.cloudera.com/cdh5/cdh/5/ cdh-5.7.0 生产或者测试环境选择对应CDH版本时,一定要采用尾号是一样的版本 ...

  7. EF6学习笔记(四) 弹性连接及命令拦截调试

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...

  8. 使用CefSharp在.Net程序中嵌入Chrome浏览器(一)——简介

    有的时候,我们需要在程序中嵌入Web浏览器,其实.Net Framework中本身就提供了WebBrowser控件,本身这个是最简单易用的方案,但不知道是什么原因,这个控件在浏览网页的时候有些莫名的卡 ...

  9. IPC_管道

    1.管道特点: 1)单向数据通信 2)匿名管道-常用于(父子进程/有血缘关系的进程之间) 3)命名管道-常用于(无血缘关系进程之间通信) 4)提供一种流式服务(发送和接受不接受字节数的大小,可取任意大 ...

  10. rand_1tom 产生 rand_1ton

    给定一个等概率随机产生1~M的随机函数rand1ToM如下: public int rand1ToM(int m) { return (int) (Math.random() * m) + 1; } ...