- 浏览: 440135 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
su6838354:
我有点疑问啊,thread1中的i自增的慢的话,thread2 ...
浅析pthread_cond_wait -
zeronever:
请问pthread_cond_signal有解锁操纵吗?我在p ...
浅析pthread_cond_wait -
paladin1988:
你这帖子真心不错。。
浅谈bitmap算法 -
parabellum_sky:
昨天还有个姑娘让我去考我说会考虑
个人日志
Polymorphism & Virtual Function
关于C++多态,看下面的例子:
#include <iostream> using namespace std; class Shape { public: virtual void print(){cout << "Call print()" << endl;} virtual void draw(){cout << "Call Shape::draw()" << endl;} }; class Circle : public Shape { public: Circle(){cout<< "Call Circle Constructor !" << endl;} void draw(){cout << "Call Circle::draw()" << endl;} void print(){cout << "Call Circle::print()" << endl;} }; class Square : public Shape { public: Square(){cout<< "Call Square Constructor !" << endl;} void draw(){cout << "Call Square::draw()" << endl;} }; class Triangle : public Shape { public: Triangle(){cout<< "Call Triangle Constructor !" << endl;} void draw(){cout << "Call Triangle::draw()" << endl;} }; int main() { typedef void(*Fun)(void); Fun pFun = NULL; Shape *A[]={new Circle,new Square,new Triangle}; Shape *Temp = new Circle; Temp->draw(); pFun = (Fun)*((int*)*(int*)(Temp)); cout << "(int*)(Temp) " << (int*)(Temp) << endl; cout << "*(int*)(Temp) " << *(int*)(Temp) << endl; cout << "(int*)*(int*)(Temp) " << (int*)*(int*)(Temp) << endl; cout << "(Fun)*((int*)*(int*)(Temp)) " << (Fun)*((int*)*(int*)(Temp)) << endl; cout << pFun << endl; pFun(); Circle Cir; Cir.draw(); pFun = (Fun)*((int*)*(int*)(&Cir)); pFun(); Shape Sh; Sh.draw(); return 0; }
输出为:
Call Circle Constructor !
Call Square Constructor !
Call Triangle Constructor !
Call Circle Constructor !
Call Circle::draw()
(int*)(Temp) 003965D8
*(int*)(Temp) 4290792
(int*)*(int*)(Temp) 004178E8
(Fun)*((int*)*(int*)(Temp)) 004112D0
004112D0
Call Circle::print()
Call Circle Constructor !
Call Circle::draw()
Call Circle::print()
Call Shape::draw()
调试变量的内容为:
Temp 0x00393ad0
[Circle] {...}
Shape {...}
__vfptr 0x004178e8 const Circle::'vftable'
[0x0] 0x004112d0 Circle::print(void)
[0x1] 0x00411005 Circle::draw(void)
Cir {...} Circle
Shape {...} Shape
__vfptr 0x004178e8 const Circle::`vftable'
[0x0] 0x004112d0 Circle::print(void)
[0x1] 0x00411005 Circle::draw(void)
Sh {...} Shape
__vfptr 0x00417bf0 const Shape::`vftable'
[0x0] 0x004112c6 Shape::print(void)
[0x1] 0x00411145 Shape::draw(void)
由调试结果可以看出:
Shape *Temp = new Circle; 和Circle Cir; 即Temp和Cir他们的虚函数列表(vtbl)是一样的,他们的虚函数指针(vptr)同指向一个虚函数列表(0x004178e8 const Circle::`vftable')。
当基类有虚函数时每一个子类都有自己的虚函数列表,而且子类的虚函数列表中的函数会覆盖基类的虚函数。当多态的情况发生时,编辑器会动态的绑定对象所要调用的虚函数,比如: Shape *Temp = new Circle; Temp->draw(); 这个Temp->draw();就是在运行时动态的绑定所要调用的虚函数,根据Circle虚函数列表来确定要调用的函数。
发表评论
-
Google编程风格
2012-04-01 17:05 1125Google编程风格(自己整 ... -
VS2008快捷键的设置
2012-02-02 13:43 2675VS2008快捷键的设置 VS2008默认的快捷键和VC++ ... -
LINK : fatal error LNK1000: Internal error during IncrBuildImage
2011-12-16 17:07 1239Win7安vc2008编译报LINK : fatal erro ... -
volatile关键字(摘自:百度百科)
2011-12-16 14:59 740volatile关键字[align=center][/alig ... -
InterlockedIncrement
2011-12-16 14:44 2202InterlockedIncrement[align=cent ... -
关键词explicit
2011-12-10 20:32 862关键词explicit[size=large][/size][ ... -
Souce Insight 设置
2011-12-09 17:16 2003Souce Insight 设置 【问题】 Source I ... -
VS2008下Boost库的安装编译下载boost库
2011-11-09 19:19 2076下载boost库 (最好去官网下,一般有SGI(GCC+用的较 ... -
C++多态技术的实现和反思(转)
2011-10-17 17:05 830面向对象技术最早出现于1960年代的Simula 67系统,并 ... -
memmove and memcpy
2011-07-31 13:11 1206memmove and memcpy 字符串的拷贝函数mem ... -
C++ 不要重新定义继承的非虚函数
2011-07-18 14:15 1313不要重新定义继承的非虚函数 如果基类和派生类有相同的非虚函数 ... -
C++ 虚函数表解析
2011-07-14 21:02 1000C++ 虚函数表解析 为什么在C++机制里要有虚函数表?虚函 ... -
C++ 默认构造函数
2011-07-14 11:39 3748C++ 默认构造函数 一直 ... -
尽量使用const
2011-07-12 10:51 1120尽可能的使用const const: ... -
Operator=
2011-07-11 21:54 949Operator= 赋值构造函数 ... -
虚析构函数
2011-07-11 10:43 1183虚析构函数 一 、为何要单独讨论虚析构函数?虚函数在类中到底 ... -
初始化列表和声明顺序之间的关系
2011-07-11 09:18 1476初始化列表和声明的顺序之间的关系 类中数据成员的声明顺序和初 ... -
初始化函数列表和构造函数内赋值之区别
2011-07-10 17:05 4526初始化函数列表和构造 ... -
传值和传引用的区别
2011-07-10 15:30 2395传值和传引用的区别 在C语言中,大都是通过值传递,C++也是 ... -
构造函数,析构函数和赋值操作符
2011-07-10 14:16 1272构造函数,析构函数和 ...
相关推荐
《C++ 编程思想》英文原版,包括卷一与卷二。 ...15: Polymorphism & Virtual Functions 16: Introduction to Templates A: Coding Style B: Programming Guidelines C: Recommended Reading Index
### C++中的虚函数(virtual function) 在C++编程语言中,虚函数是一种非常重要的特性,它主要用于实现多态性(polymorphism),这是面向对象编程的一个核心概念。通过虚函数,程序可以在运行时动态地决定调用哪个具体...
在C++中,多态性主要通过虚函数(virtual function)实现。本文将通过一系列示例来深入探讨C++中的多态性,并解释如何在实际编程中应用这一特性。 #### 二、基础知识回顾 在深入了解多态之前,我们需要先回顾一下...
1. 函数重载(Function Overloading) 函数重载是指在同一作用域内,可以有多个同名函数,但它们的参数列表不同,即参数类型、个数或顺序不一致。这使得开发者可以根据传入的不同参数调用合适的函数,实现了同名函数...
Polymorphism and Virtual Functions; Templates; Linked Data Structures; Exception Handling; Standard Template Library; Patterns and UML. For all readers interested in the C++ programming language.
在C++编程中,"CHAPTER 9 POLYMORPHISM"这一章节主要讲解了面向对象程序设计中的一个重要概念——多态性(Polymorphism)。多态性是对象导向编程语言的核心特性之一,它允许我们使用一个接口来表示多种类型的行为。...
在C++编程中,多态性(Polymorphism)是面向对象编程的重要特性之一。它允许我们使用同一个函数名或操作符实现不同的功能,具体执行的功能取决于调用时的对象类型。这种灵活性使得代码更具可扩展性和重用性。 9.1 ...
在C++编程语言中,`virtual`关键字是一个非常重要的特性,它主要用于实现多态性(Polymorphism),这是面向对象编程中的三大基本特征之一。本文将深入探讨`virtual`关键字的作用、使用场景以及相关的概念。 1. **...
在C++编程中,多态性(Polymorphism)是一个至关重要的特性,它体现了面向对象编程的核心理念。多态性允许我们使用一个通用的名字来表示不同的功能或对象,这在运行时提供了极大的灵活性。在本章中,我们将深入探讨...
纯虚拟函数的存在(Presence of a Pure Virtual Function) 虚拟规格的存在(Presence of a Virtual Specification) 虚拟规格中const的存在 重新考虑class的声明 5.1 无继承情况下的对象构造 抽象数据类型...
在C++中,多态(Polymorphism)是面向对象编程的一个核心概念,它允许我们使用一个接口来表示多种不同的类型。多态性使得代码更加灵活,可扩展性更强,可以减少代码重复,并提高代码的复用性。在这个文档中,通过两...
在C++编程语言中,虚函数(virtual function)和纯虚函数(pure virtual function)是多态性(polymorphism)实现的关键技术,它们支持程序设计中的一种重要特性,即可以使用指向派生类的基类指针来调用相应派生类的...
本讲解将深入探讨这两种联编方式,以及虚函数(Virtual Function)、纯虚函数(Pure Virtual Function)和虚析构函数(Virtual Destructor)等关键概念。 静态联编,也称为早期绑定或编译时绑定,是指在编译期间就...
1. 虚函数(Virtual Function):虚函数是C++中的一种特殊函数,用于实现多态性。虚函数的关键字是virtual。 2. 程序入口点(Main Function):每个C++程序都需要一个入口点,即main函数,它是程序的起点。 3. ...
* 虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)的定义和应用 * 虚析构函数(Virtual Destructor)的定义和应用 * 内存泄漏(Memory Leak)的定义和解决方法 七、网络编程 * OSI 模型(Open ...
纯虚拟函数的存在(Presence of a Pure Virtual Function) 虚拟规格的存在(Presence of a Virtual Specification) 虚拟规格中const的存在 重新考虑class的声明 5.1 无继承情况下的对象构造 抽象数据类型...
1、C++中的虚函数(virtual function) 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: virtual void foo() ...
- **纯虚函数(Pure Virtual Function)**:形如`virtual function() = 0;`的函数,定义抽象类,无法实例化,用于建立类层次的接口。 实验中提到,理解静态连编和动态连编的区别至关重要。静态连编在编译阶段完成...
在C++中,多态性主要通过虚函数(virtual function)来实现。实验中通过类B和它的派生类D展示了这一点。类B定义了三个虚函数f1、f2和f3,而类D覆盖了这些虚函数。在main函数中,通过基类指针pb指向派生类D的对象,调用...