虚函数(virtual)与多态(polymorphism)、动态绑定(dynamic binding)
来源:互联网 发布:移动广告数据 编辑:程序博客网 时间:2024/05/21 06:29
虚函数(virtual)与多态(polymorphism)、动态绑定(dynamic binding)
首先介绍虚函数、多态、动态绑定的的概念:
1.虚函数产生意义:就是“违反”“如果你以一个基类指针指向一个派生类的对象,那么通过该指针你就只能够调用基类所定义的成员函数”这条规定而诞生的。简言之,就是在派生类的成员函数前面加“virtual“关键字就变成了虚函数。基类指针就可以调用这个虚函数。
2.多态意义:就是让处理“基类的对象”的程序代码能够完全无碍地继续适应处理“派生类对象”。多态的本质是同样的用法在实现上却是不同的。
举一个绘图形例子:
#include <iostream.h>
class Shape//形状
{
public:
virtual void DrawSelf()
{
cout << " Shape:我是一个什么也绘不出的图形" << endl;
}
};
class Polygo:public Shape//多边形
{
public:
void DrawSelf()
{
cout << " Polygo:连接各顶点" << endl;
}
};
class Circ:public Shape//圆
{
public:
void DrawSelf()
{
cout << " Circ:以圆心和半径为依据画弧" << endl;
}
};
int main()
{ Shape *pShape;//基类指针
Polygo polygon; //派生类对象
Circ circ;
pShape = & polygon;//基类指针指向派生类
pShape ->DrawSelf();//程序代码一样但实现的结果不一样,这就满足多态的特征。
pShape = & circ;
pShape ->DrawSelf();
return 0;
}
输出结果:
Polygo:连接各顶点
Circ:以圆心和半径为依据画弧
3.虚函数都是动态绑定。每个“含有虚函数的类”,C++编译器都会给它做一个虚函数表。表中每一个元素都指向一个虚函数地址。
上例子衍生:
#include <iostream.h>
class Shape//形状
{
public:
virtual void DrawSelf(){};
int a;
}
class Polygo:public Shape//多边形
{
public:
virtual void DrawSelf(){};
virtual void SetColor(){};
int n;
int color;
};
class Circ:public Shape//圆
{
public:
void DrawSelf(){} ;
virtual void SetPoint(){};
int r;
int x,y;
};
int main()
{ cout<<sizeof(Shape)<<endl;
cout<<sizeof(Polygo)<<endl;
cout<<sizeof(Circ)<<endl;
Shape shape;//基类对象
Polygo polygo; //派生类对象
Circ circ;
polygo.n =6;
polygo.color = 250;
circ.r = 20;
circ.x = 10;
circ.y = 10;
cout<<polygo.n<<endl;
cout<<polygo.color<<endl;
cout<<circ.r<<endl;
cout<<circ.x<<endl;
cout<<circ.y<<endl;
cout<<&polygo<<endl;
cout<<&(polygo.n)<<endl;
cout<<&(polygo.color)<<endl;
cout<<&circ<<endl;
cout<<&(circ.r)<<endl;
cout<<&(circ.x)<<endl;
cout<<&(circ.y)<<endl;
return 0;
}
输出结果:
8
16
20
1
6
250
20
10
10
0x0013ff78
0x0013ff7c
0x0013ff68
0x0013ff6c
0x0013ff70
0x0013ff74
0x0013ff54
0x0013ff5c
0x0013ff60
0x0013ff64
Shape、 Polygo 、Circ内存结构:
Shape
0x0013ff78 vptr
0x0013ff7c a
---->
(*DrawSelf())
---->class Shape:DrawSelf()
Polygo
0x0013ff68 vptr
0x0013ff6c a
0x0013ff70 n
0x0013ff74 color
--à
(*DrawSelf())
(*SetColor())
---->class Polygo:DrawSelf()
---->class Polugo: SetColor()
Circ
0x0013ff54 vptr
0x0013ff58 a
0x0013ff5c r
0x0013ff60 x
0x0013ff64 y
--à
(*DrawSelf())
(*SetPoint())
---->class Circ:DrawSelf()
---->class Circ: SetPoint()
- 虚函数(virtual)与多态(polymorphism)、动态绑定(dynamic binding)
- 虚函数与动态绑定 / Virtual function and Dynamic Binding
- 多态和动态绑定(polymorphism and dynamic binding)
- Java中的多态(polymorphism)和动态绑定(dynamic binding)
- 静态绑定(static-binding) 动态绑定(dynamic-binding)
- 如何理解C++中的动态绑定(dynamic binding)
- 如何理解C++中的动态绑定(dynamic binding)
- java 动态绑定 dynamic binding
- C++ 动态绑定Dynamic binding
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- 【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding
- 2. objC 动态绑定(dynamic binding)
- C#4.0 动态绑定(Dynamic Binding)
- Java 多态 (polymorphism) Virtual Methods
- Polymorphism, Dynamic Typing, and Dynamic Binding
- WCF 绑定(Binding)
- 数据绑定(Binding)
- Squirrel脚本语言..游戏开发.
- 尊重反动派(上)
- 你应当如何学习C++以及编程: )
- [DirectShow] 从一个小程序开始
- [zz]2009年最有前途的科技初创公司及青年创业者名单
- 虚函数(virtual)与多态(polymorphism)、动态绑定(dynamic binding)
- LINQ Books
- 解决vs2005连接远程SQL数据库问题
- yes1
- joomla环境配置
- 喜洋洋与灰太郎免费观看地址
- 抽屉原理
- yes22
- LINQ: Building an IQueryable Provider - Part I