一、 基本概念 C++中的虚函数的作用主要是实现了多态的机制。
关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。
所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
二、 虚函数的定义与派生类中的重定义 class 类名
{
public:
virtual 成员函数说明;
}
class 类名:访问修饰符 基类名
{
public:
virtual 成员函数说明;
}
三、 虚函数在内存中的结构1.我们先看一个例子- #include <iostream>
- using namespace std;
- class A
- {
- public:
- virtual void fun0() { cout << "A::fun0" << endl; }
- };
- int main(void)
- {
- A a;
- cout << "size of A = " << sizeof(a) << endl;
- return 0;
- }
结果:size of A = 4
2.如果再添加一个虚函数 virtual void fun1() { cout << "A::fun1" << endl; }
得到相同的结果。如果去掉函数前面的virtual修饰符 结果:size of A = 1
3.在看下面的结果- #include <iostream>
- using namespace std;
- class A
- {
- public:
- virtual void fun0() { cout << "A::fun0" << endl; }
- int a;
- int b;
- };
- int main(void)
- {
- A a;
- cout << "size of A = " << sizeof(a) << endl;
- return 0;
- }
结果:size of A = 12
在 lip32 平台下指针在内存中占4个字节,虚函数在一个虚函数表(VTABLE)中保存函数地址。
在看下面例子:
- #include <iostream>
- using namespace std;
- class A
- {
- public:
- virtual void fun0() { cout << "A::fun0" << endl; }
- virtual void fun1() { cout << "A::fun1" << endl; }
- };
- int main(void)
- {
- A a;
- cout << "size of A = " << sizeof(a) << endl;
- return 0;
- }
结果:
size of A = 4
4.我们再来看看继承中虚函数的内存结构先看下面的例子
- #include <iostream>
- using namespace std;
- class A
- {
- public:
- virtual void fun0() { cout << "A::fun0" << endl; }
- };
- class B
- {
- public:
- virtual void fun0() { cout << "B::fun0" << endl; }
- };
- class C
- {
- public:
- virtual void fun0() { cout << "C::fun0" << endl; }
- };
- class D : public A, public B, public C
- {};
- int main(void)
- {
- D d;
- cout << "size of D = " << sizeof(d) << endl;
- return 0;
- }
结果:size is = 12
C++ 虚函数表解析
阅读(4989) | 评论(0) | 转发(7) |