前言
虚函数的实现包含两个重要部分,虚函数表和虚函数表指针。
- 虚函数表:一个类如果有虚函数,则针对这个类会产生一个虚函数表;
虚函数表属于类。 - 虚函数表指针:生成这个类的对象时,对象里就包含了一个指针(虚函数指针),用来指向这个虚函数表的起始地址;
虚函数表指针属于对象,一般位于对象内存的起始位置。
虚函数表分析
看如下示例代码(代码1),父类Base包含三个虚函数f、g、h,子类Derive重写了其中两个虚函数f、g:
class Base
{
public:
Base() {
}
virtual void f() {
cout << "Base::f()" << endl; }
virtual void g(int n) {
cout << "Base::g(" << n << ")" << endl; }
virtual void h() {
cout << "Base::h()" << endl; }
};
class Derive : public Base
{
public:
Derive() {
}
void f() {
cout << "Derive::f()" << endl; }
void g(int n) {
cout << "Derive::g(" << n << ")" << endl; }
};
int main()
{
Base* pb = new Base;
Base* pd = new Derive;
pd->f();
pd