您的位置:首页 > 编程语言 > C语言/C++

c++虚函数

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

好了,开始吧!

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

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

};


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

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

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

2.运行作用和机理:

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

int main(int argc, char* argv[])
{
//    CShape *S0=new CShape;
//    S0->say();
CShape *S1=new  CSanjiao;
S1->calarea();
CShape *S2=new CRetng;
S2->callangth();

CShape *S3=new CCube;
S3->say();   //看来这个爷爷辈的可以

CRetng *S4=new CCube;
S4->say() ;//父辈的也可以
return 0;
}


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

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

编译器发现一个类中有被声明为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

希望指正,多多留言!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: