虚函数的内存结构
虚函数的内存结构
一、 基本概念
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;
- }
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;
- }
在 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;
- }
C++ 虚函数表解析