示例:
#include<iostream>
using namespace std;
class A
{
public:
virtual void vprintA1()
{
cout << "A1VR" << endl;
}
virtual void vprintA2()
{
cout << "A2VR" << endl;
}
void printA1()
{
cout << "A1" << endl;
}
void printA2()
{
cout << "A2" << endl;
}
};
class B:public A
{
public:
virtual void vprintA1()
{
cout << "BA1VR" << endl;
}
void printA1()
{
cout << "BA1" << endl;
}
};
class C:public B
{
public:
virtual void vprintA2()
{
cout << "CA2VR" << endl;
}
void printA2()
{
cout << "CA2" << endl;
}
};
int main()
{
A a;
a.vprintA1();
a.vprintA2();
a.printA1();
a.printA2();
cout << endl;
B b;
A* a1 = &b;
A aa1 = b;
a1->vprintA1();
a1->vprintA2();
a1->printA1();
a1->printA2();
aa1.vprintA1();
aa1.vprintA2();
aa1.printA1();
aa1.printA2();
cout << endl;
C c;
A* b1 = &c;
A bb1 = c;
b1->vprintA1();
b1->vprintA2();
b1->printA1();
b1->printA2();
bb1.vprintA1();
bb1.vprintA2();
bb1.printA1();
bb1.printA2();
cout << endl;
return 0;
}
示例输出:
A1VR
A2VR
A1
A2
BA1VR
A2VR
A1
A2
A1VR
A2VR
A1
A2
BA1VR
CA2VR
A1
A2
A1VR
A2VR
A1
A2
如图所示,虚表的指针为_vfptr
:
其中,以下谈论为此代码段
B b;
A* a1 = &b;
A aa1 = b;
B b
得到对象b
,类B
是A
的派生类,其中B
重写了虚函数vprintA1
;
1、虚函数vprintA1
在类A
中的虚函数指针为0x00021537
,虚函数vprintA2
在类A
中的虚函数指针为0x00021532
;
2、虚函数vprintA1
在类B
中的虚函数指针为0x00021541
,虚函数vprintA2
在类B
中的虚函数指针为0x00021532
;
通过A* a1 = &b
指针a1
指向类B
的虚表,因此a1->vprintA1()
的结果为类B
中重写函数的结果。
不同于,A aa1=b
中的对象aa1
的虚表为类A
的虚表。