直接上代码吧:
#include <cstdio>
class Base{
public:
//没用到,是为了让类有实体大小
int num = 10;
virtual void print() const {printf("in Base\n");}
};
class Derived : public Base{
public:
void print() const {printf("in Derived\n");};
};
void virtualTest(const Base *pb){
pb->print();
}
typedef void (*PFUN)();
int main(){
//打印下基本信息,直观感知下大小,sizeof(Base)=16,sizeof(Derived)=16,sizeof(long)=8,sizeof(int)=4
printf("sizeof(Base)=%ld,sizeof(Derived)=%ld,sizeof(long)=%ld,sizeof(int)=%ld\n",sizeof(Base),sizeof(Derived),sizeof(long),sizeof(int));
Base b;
Derived d;
PFUN pfun = *(*(PFUN **)&d);
//in Derived,直接调用Derived虚函数表print函数
pfun();
pfun = *(*(PFUN **)&b);
//in Base,直接调用Base虚函数表print函数
pfun();
//in Derived,虚函数加指针体现多态特征
virtualTest(&d);
//in Derived,不通过指针没有体现多态,实际上在编译器就已经确定了调用Derived的print函数
d.print();
//把Base的虚函数表指针赋值给Derived
*(PFUN **)&d = *(PFUN **)&b;
//in Base,多态,因为虚函数表指针已经重新赋值,这儿反而打印Base
virtualTest(&d);
//in Derived,没有体现多态,编译器决定调用Derived的print函数
d.print();
}