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 动态类型.静态类型指的是对象声明的类型,在编译器确定的.动态 ...
随机推荐
- javascript常见内存泄露
一.全局变量引起的内存泄漏 function func(){ lmw = 123456 //lmw是全局变量,不会被释放 } 二.闭包引起的内存泄漏 function func(){ var lmw ...
- TJOI2018 简要题解
数学计算 用线段树记录之前乘过的每一个数,作除法时把原本的乘数改成111即可. 代码: #include<bits/stdc++.h> #define lc (p<<1) #d ...
- SignalR 服务器系统配置要求
SignalR 所支持的服务器版本..NET Framework 版本.IIS和其他组件. SignalR操作系统要求 SignalR组件能够运行在下面的服务器和客户端操作系统.需要注意的是使用Web ...
- 第二周Access课总结
一.问;这节课你学到了什么知识? 答:回忆上周主要学了关于Access的基础知识和基本操作,一转眼,这周也学到了很多,主要学Access的数据类型的表的建立和管理相关的操作! 收获多少在于学了多少,正 ...
- two sum --无脑法
public class Solution { /* * @param numbers: An array of Integer * @param target: target = numbers[i ...
- HAProxy出现"远程主机强迫关闭了一个现有的连接 " 的错误及解决
使用haproxy作为sql server 的负载均衡器. 使用了文档中的示例配置项: timeout client 50s timeout server 50s 采用这个配置项,有时会 ...
- EF生成实体自动添加数据库字段注释
我们在用EF从数据库生成模型的时候,默认实体类是没有注释的,但是我们已经在数据库字段添加说明了,能不能自动把注释也拿过来? 答案是:能. 那么我们开始 首先随便开一个ASP.NET MVC项目,我 ...
- 算法入门:最大子序列和的四种算法(Java)
最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...
- mysql升级8.0后项目不能连接问题
转载简书:https://www.jianshu.com/p/a164d582e5d9 主要是因为驱动配置变了driver中得用com.mysql.cj.jdbc.Driver,多了个cj: url后 ...
- Eclipse上搭建Spring的开发环境
一.安装Spring Tool Suite插件 如图: 点击Finish之后等待安装,安装完之后弹窗点击yes重启Eclipse,重启后显示如下界面: 二.搭建Spring开发环境 1.导入jar包到 ...