C++多态的原理
- 一.虚函数表指针
- 二 .多态是如何实现的
一.虚函数表指针
下面编译为32位程序的运行结果是什么()
A.编译报错 B. 运行报错 C.8 D.12
classBase{public:virtualvoidFunc1(){cout<<"Func1()"<<endl;}protected:int_b=1;char_ch='x';};intmain(){Base b;cout<<sizeof(b)<<endl;return0;}上面题目运行结果12bytes,除了_b和_ch成员,还多⼀个__vfptr放在对象的前面(注意有些平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual f 代表function)。⼀个含有虚函数的类中都至少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表
二 .多态是如何实现的
大家可以以下面的代码辅助来理解
- 从下面代码我们发现 在我们Person类里面是有一个虚函数表的,我们把这个虚函数的地址放到了虚函数表里面,这就使得我们把派生类传给了基类 但是仍然可以调用派生类的虚函数 这就是从这个虚函数表里面找到的
- st里面不应该有两个虚函数的地址吗(一个基类一个派生类),为什么只显示了一个地址?
答:那是因为我们的派生类重写了基类 把基类地址直接给覆盖掉了 这就使得我们只能调用我们的派生类的虚函数- 如果基类虚函数的参数和派生类虚函数的参数都有默认值的话 那我们在虚函数里面打印这个值的话 打印的是谁的呢?
答:打印的是我们的基类虚函数的默认参数值,因为我们这个参数在编译的时候就写死了 ,只是满足多态我们在找函数实现的时候是通过我们的虚函数表来寻找函数地址的
打印的还是基类的默认值