看了一段时间,觉得应该开始记笔记了,选择博客园是因为在这里学到了好多东西!希望我作为初级的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
希望指正,多多留言!