C++ Virtual详解
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++ Object Model ,Addison Wesley 1996)
class Base
{
public:Base(){}
public:virtual void print(){cout<<"Base";}
};class Derived:public Base
{
public:Derived(){}
public:void print(){cout<<"Derived";}
};int main()
{Base *point=new Derived();point->print();
}
//---------------------------------------------------------
#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};void main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)
// Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}
class Query {
public:
// 声明纯虚拟函数
virtual ostream& print( ostream&=cout ) const = 0;
// ...
};
// Query 声明了纯虚拟函数, 我们不能创建独立的 Query 类对象
// 正确: NameQuery 是 Query 的派生类
Query *pq = new NameQuery( "Nostromo" );
// 错误: new 表达式分配 Query 对象
Query *pq2 = new Query();
虚析构:
虚继承:
原文地址:http://blog.csdn.net/ring0hx/article/details/1605254
C++ Virtual详解相关推荐
- C++ Virtual详解
C++ Virtual详解 Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Bas ...
- 虚方法virtual详解(转载)
从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的 ...
- C++基础之关键字——virtual详解
virtual C++中的virtual关键字主要有这样几种使用场景:第一,修饰父类中的函数 :第二,修饰继承性.注意:友元函数.构造函数.static静态函数不能用virtual关键字修饰.普通成员 ...
- C#中虚方法(virtual)详解
前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法: 目录: 一.虚方法的定义: 二.虚方法的声明: 三.虚方法的调用: 四.虚方法的规则: 五.虚方法注意事项: 六.虚方法的好处: ...
- Virtual PC 2007下虚拟机与本机双XP系统实现互联与上网详解
Virtual PC 2007下虚拟机与本机双XP系统实现互联与上网详解 1.在虚拟机安装windowsXP系统 2.为了不影响用来上网的原网卡,所以我们选择在主机上装一个虚拟网卡来与虚拟机进行通信, ...
- Virtual Hard Disk(VHD)文件格式详解
VHD 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的镜像格式是虚拟硬盘 (VHD) 镜像格式.它既用于存储硬盘 ...
- Virtual Hard Disk version 2 (VHDX) 文件格式详解
VHDX 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的映像格式是虚拟硬盘版本 2 (VHDX) 映像格式.该规 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- arm-linux-ld中的参数,arm-linux-ld指令详解
arm-linux-ld指令详解 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系 ...
最新文章
- 程序员面试题100题第19题——反转链表
- struct x264_t 维护着CODEC的诸多重要信息
- jquery each函数 break和continue功能
- ACM模板——拓扑排序
- 【Elasticsearch】 es primary shard 主分片 PrimaryOperationTransportHandler
- linux解挂文件磁盘的命令,Linux学习笔记(4)磁盘分区(fdisk)、挂载与文件系统命令...
- 新零售不简单,当初马云自己都没解释清楚!
- 怎样做才是一个独立自主的人?
- Ruby的case语句
- 未来计算机体系结构探索,未来计算机体系结构将是什么样的发展趋势
- 平均年薪 15 万,超 6 成本科学历,程序员薪资调查报告大曝光!
- 南京大学计算机视觉博士生导师,孙正兴——著名计算机专家孙正兴——南京大学教授...
- 北京航空航天大学计算机学院保研率,北京航空航天大学计算机学院(专业学位)计算机技术保研条件...
- Atcoder题解与视频集
- 二进制数字的表示方法
- 2019最值得收藏的24个日语学习网站
- java坦克大战(2.0)
- 360类redis存储服务Pika的安装和使用
- TCP/IP路由协议-BGPOSPF路由抖动问题
- Hunter的读《高效程序员的45个习惯》