多态2........

虚函数的virtual和虚继承腰部的virtual没有一点关系!

多态和虚继承都在内存中产生了额外的东西(多态是多了虚VFT指针指向虚函数表,虚继承是多了虚基表(保存了偏移量),但是他们两个没有一点关系!
那要是两个套在一起呢?那也是各是各的,你解决你的数据冗余二义性,我解决我的多态问题。

再次理解这个题目
多态2........_第1张图片
为什么调用func()的this指针是A* 呢 而不是B*?
考虑到之前继承中子类对父类进行构造需要调用父类的构造函数,也就是说各玩各的,那么这里在test()里面调用func(),它this指针应该是A*,因为各玩各的。
A* 指向B对象发生了切片,因为new的是B对象,B对象调用了test( )。
所以这里符合多态条件1,父类指针指向子类对象
条件2,三同满足但是缺省参数不同,这里只需要形参类型相同就可以和缺省参数无关,那么条件2也满足
这里需要注意子类重写父类的虚函数只重写了父类虚函数的函数体内容,套用的还是父类的函数外壳(返回值函数名函数形参),所以这里缺省参数是int val = 1;

派生类继承父类的虚函数,只要有虚函数就会有虚表,对象里面就会存一个虚表指针
多态2........_第2张图片
那么看到这里不满足多态条件2 ,我没有重写父类的虚函数
还可以看到虚表指针不一样,说明两张虚表不一样(但是保存的都是父类的虚函数指针(因为没有重写)),这很正常啊,一个是父类一个是子类,子类拷贝了父类的虚表,他们不同没什么问题啊,不会互相影响。你要满足多态那我就覆盖父类的虚表就可以了。

但是对于相同类型的对象来说,他们是可以公用同一张虚表的。
多态2........_第3张图片

关于重写和覆盖
重写是语言层面上,我子类重写了父类的虚函数
覆盖是底层上来说我覆盖了父类的虚函数地址,改为我重写后的虚函数地址

关于动态绑定和静态绑定
对于函数重载在编译时就可以通过函数名修饰规则找到调用函数

但是多态是比函数重载要慢一步找到要调用哪个函数的,多态是在运行时到虚表里面去找调用哪个函数。

你可能感兴趣的:(C++,c++)