当前位置: 首页 > 图文教程 > 开发语言 > VC++ > C++中的虚函数(一)
| C++中的虚函数(一)
class 类名{public: virtual 成员函数说明;}class 类名:基类名{ public: virtual 成员函数说明;} 三、 虚函数在内存中的结构1.我们先看一个例子: #include "iostream.h"#include "string.h"class A {public: virtual void fun0() { cout << "A::fun0" << endl; }};int main(int argc, char* argv[]){ A a; cout << "Size of A = " << sizeof(a) << endl; return 0;} 结果如下:Size of A = 42.如果再添加一个虚函数:virtual void fun1() { cout << "A::fun" << endl;} 得到相同的结果。如果去掉函数前面的virtual修饰符 class A {public: void fun0() { cout << "A::fun0" << endl; }};int main(int argc, char* argv[]){ A a; cout << "Size of A = " << sizeof(a) << endl; return 0;} 结果如下:Size of A = 13.在看下面的结果: class A {public: virtual void fun0() { cout << "A::fun0" << endl; }int a;int b;};int main(int argc, char* argv[]){ A a; cout << "Size of A = " << sizeof(a) << endl; return 0;} 结果如下:Size of A = 12 其实虚函数在内存中结构是这样的: ![]() 图一 在window2000下指针在内存中占4个字节,虚函数在一个虚函数表(VTABLE)中保存函数地址。在看下面例子。 class A {public: virtual void fun0() { cout << "A::fun0" << endl; }virtual void fun1() { cout << "A::fun1" << endl; }int a;int b;};int main(int argc, char* argv[]){ A a; cout << "Size of A = " << sizeof(a) << endl; return 0;} 结果如下:结果如下: Size of A = 4 虚函数的内存结构如下,你也可以通过函数指针,先找到虚函数表(VTABLE),然后访问每个函数地址来验证这种结构,在国外网站作者是:Zeeshan Amjad写的"ATL on the Hood中有详细介绍" ![]() 图二 4.我们再来看看继承中虚函数的内存结构,先看下面的例子 class A {public: virtual void f() { }};class B {public: virtual void f() { }};class C {public: virtual void f() { }};class Drive : public A, public B, public C {};int main() { Drive d; cout << "Size is = " << sizeof(d) << endl; return 0;} 结果如下:Size is = 12 ,相信大家一看下面的结构图就会很清楚, ![]() 图三 5.我们再来看看用虚函数实现多态性,先看个例子: class A {public: virtual void f() { cout << "A::f |