c++中虚函数和多态性
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++中虚函数和多态性的更多相关文章
- C++中虚函数的作用浅析
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...
- C++中虚函数的作用是什么?它应该怎么用呢?(转)
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...
- c++中虚函数
虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难.我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术.说明一点 ...
- C++中虚函数的作用和虚函数的工作原理
1 C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数:虚函数的作用:多态性:多态公有继承:动态联编 C++中的虚函数的作用主要是实现了多态的机制.基类定义虚函数,子类可以重写该函数 ...
- <转>C++继承中虚函数的使用
转自:http://blog.csdn.net/itolfn/article/details/7412364 一:继承中的指针问题. 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对 ...
- 关于C++与Java中虚函数问题的读书笔记
之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...
- C++中虚函数功能的实现机制
要理解C++中虚函数是如何工作的,需要回答四个问题. 1. 什么是虚函数. 虚函数由于必须是在类中声明的函数,因此又称为虚方法.所有以virtual修饰符开始的成员函数都成为虚方法.此时注意是vir ...
- C++中虚函数的动态绑定和多态性
目录 静态类型 vs 动态类型.静态绑定 vs 动态绑定 虚函数动态绑定实现机制.虚析构函数 多态性 一.静态 vs 动态 静态类型 VS 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态 ...
随机推荐
- AX_InventCounting
static void Job649(Args _args) { ItemId ItemId = "000XA00612R1& ...
- python_day12_css
目录: 简介 选择器(selecttor) 常用属性 页面布局 一.简介 1.CSS 定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表. CSS 规则由两个主要的部 ...
- ABP框架系列之二十八:(Handling-Exceptions-异常处理)
Introduction This document is for ASP.NET MVC and Web API. If you're interested in ASP.NET Core, see ...
- 服务器安装ubuntu 14.04 server,开机启动屏幕不停滚动错误WRITE SAME failed. Manually zeroing
昨天给服务器上安装了一个Ubuntu-14.04-server系统,安装完成后系统可以正常启动,但屏幕上一直滚动着一个错误,sda1:WRITE SAME failed. Manually zeroi ...
- Html5与Css3知识点拾遗(四)
web图像 JPEG:适用于大多数照片,颜色较多,可接受质量损失的图像 PNG-8:适用标识.重复的图案以及其他颜色较少的图像或具有连续颜色的图像 PNG-24:不支持颜色更多的图像,适用与颜色丰富且 ...
- Request参数值自动去空格
/// <summary> /// TypeTrimHelper /// </summary> public static class TypeTrimHelper { /// ...
- 背水一战 Windows 10 (87) - 文件系统: 获取文件的属性, 修改文件的属性, 获取文件的缩略图
[源码下载] 背水一战 Windows 10 (87) - 文件系统: 获取文件的属性, 修改文件的属性, 获取文件的缩略图 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获 ...
- 背水一战 Windows 10 (83) - 用户和账号: 数据账号的添加和管理, OAuth 2.0 验证
[源码下载] 背水一战 Windows 10 (83) - 用户和账号: 数据账号的添加和管理, OAuth 2.0 验证 作者:webabcd 介绍背水一战 Windows 10 之 用户和账号 数 ...
- 安装stress模拟linux系统资源消耗
1.安装yum源:yum install epel-release -y 2.安装stress:yum install stress -y 3.使用样例:stress -c 1 -t 60 4.测试场 ...
- 基于ε-NFA的正则表达式引擎
正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲 ...