class animal{
void speak(){
cout << "动物在叫!"<<endl;
}
}

这个类占内存大小是1,当你使用virtual 将函数改为虚函数时,这个类占内存为4

class animal{
void virtual speak(){
cout << "动物在叫!"<<endl;
}
}

这4个字节的内存占用,其实就是一个指针

他是什么类型的指针呢? VFPTR(virtual function pointer) 虚函数(表)指针.

这个指针它指向一个表-->vftable (virtual function Table) 虚函数表.

表内部记录虚函数的地址,在这里它记录的是speak函数的地址, &animal::speak

class cat:public animal{
public:

}

现在这个子类里面什么也没有写,只是单纯的继承了父类.

那么vfptr也继承了,并且也指向了子类的虚函数表 vftable 指向 --> & animal::speak

如果在此时发生重写:

class cat:public animal{
public:
    void virtual speak(){
    cout << "动物在叫!"<<endl;
}
}

那么指针就会指向 --> &cat::speak

父类不变.

当父类的指针或引用指向子类的时候,此时就发生多态行为.

animal & p = cat;
animal.apeak();//的时候,会调用指向的cat(运行时发生,而不是编译时)
最后修改:2022 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏