在C++中随处可见封装,继承,多态。
多态的实现,是基于虚函数的继承,虚函数则是基于虚函数表和虚函数表指针。
用一个示例介绍虚函数表指针访问虚函数,更易于方便理解虚函数,程序中也有注释
// virtual-table.cpp
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << __func__ << endl;
}
virtual void fun() {
cout << "A : " << __func__ << endl;
};
virtual void bar() {
cout << "A : " << __func__ << endl;
};
};
class B : public A {
public:
B() : A() {
cout << __func__ << endl;
}
void fun() {
cout << "B : " << __func__ << endl;
}
void bar() {
cout << "B : " << __func__ << endl;
}
};
int main (int argc, char *argv[])
{
typedef void (*pfun) (void);
int bits = sizeof(int *);
B b;
B b1;
cout << "-------- 虚函数表 -----------" << endl;
// 虚表地址存在于每个实例对象的首地址处
// 虚函数表地址是同一个地址,说明虚表只属于该类
// 不属于该类的实例子对象
cout << *(int *)*(int *)&b << endl;
cout << *(int *)*(int *)&b1 << endl;
pfun fun = NULL;
pfun fun1 = NULL;
cout << "----- 利用虚表调用函数 ------" << endl;
fun = (pfun)*((int *)*(int *)&b);
fun();
if (8 == bits) {
fun = (pfun)*((int *)*(int *)&b + 2);
}
else if (4 == bits) {
fun = (pfun)*((int *)*(int *)&b + 1);
}
fun();
fun1 = (pfun)*((int *)*(int *)&b);
fun1();
if (8 == bits) {
fun1 = (pfun)*((int *)*(int *)&b + 2);
}
else if (4 == bits) {
fun1 = (pfun)*((int *)*(int *)&b + 1);
}
fun1();
// 多态
cout << "---------- 指针 -------------" << endl;
A *a = new B;
a->fun();
cout << "---------- 引用 -------------" << endl;
A &a1 = b;
a1.bar();
return 0;
}
编译,运行
[email protected] $ g++ virtual-table.cpp
[email protected] $ ./a.out
A
B
A
B
-------- 虚函数表 -----------
4197940
4197940
----- 利用虚表调用函数 ------
B : fun
B : bar
B : fun
B : bar
---------- 指针 -------------
A
B
B : fun
---------- 引用 -------------
B : bar