乐之者体感开发

好知者不如乐之者,体感开发请点击:http://www.enjoythis.net/

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

看了一段时间,觉得应该开始记笔记了,选择博客园是因为在这里学到了好多东西!希望我作为初级的C++(入门级),帮助那些看不懂大牛们写的文章的童鞋们!

好了,开始吧!

虚函数----不真实的,关键字: virtual

class CShape  
{
public:
CShape();
virtual ~CShape();
virtual void callangth()=0;
virtual void calarea()=0;
virtual void say(); //非纯虚函数

};


注意:当你写callangth()=0 ;时,你已经表明这个为纯的虚函数!这个类就是为抽象类!就不要实例化了,不现实!!!

有人这样说虚函数(很贴切):

一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

2.运行作用和机理:

虚函数的强大与巧妙在于用于 c++多态里面!

 1 int main(int argc, char* argv[])
2 {
3 // CShape *S0=new CShape;
4 // S0->say();
5 CShape *S1=new CSanjiao;
6 S1->calarea();
7 CShape *S2=new CRetng;
8 S2->callangth();
9
10 CShape *S3=new CCube;
11 S3->say(); //看来这个爷爷辈的可以
12
13 CRetng *S4=new CCube;
14 S4->say() ;//父辈的也可以
15 return 0;
16 }

灵活的调用了各自不同的方法实现!

虚函数不同于一般的函数,一般的函数是在编译时就决定了怎样运行,运行那里!然而虚函数不是这样的!下面是一段摘来的介绍:

 

编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是 VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生 类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的 时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将 这个调用改写!

 

我的实验结果:

可见,每一个重写的虚函数都已经分配到了指针,调用时相当于调用了这个指针!

3.注意点:

这个虚函数为override 不是overload(重载)!

基类的析构函数必须是虚函数!

下面是我的一个例子的下载地址:http://115.com/file/dn86pu6k

参考文档:http://wenku.baidu.com/view/84520bf67c1cfad6195fa7be.html

希望指正,多多留言!

 

 

 

 

 

 

posted on 2011-09-27 21:18  伟征  阅读(335)  评论(0编辑  收藏  举报