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(运行时发生,而不是编译时)