多态(简单复习)
virtual的应用于虚函数的重写,由基类的指针或者引用中的vfptr函数指针(虚函数表)去调用对象的虚函数,形成多态
但是我们的重点是我们极易混淆的:
virtual继承(虚继承):
这里的virtual和上面虚函数的virtual没有一点关系(记住)
这里构成B和C构成虚继承(公用一个A::_a)
所以说虚继承解决的菱形继承中的数据冗余和二义性
class A
{
public:
int _a;
};
class B:virtual public A
{
public:
int _b;
};
class C :virtual public A
{
public:
int _c;
};
class D :public B, public C
{
public:
int _d;
};
int main()
{
D d;
d.B::_a = 10;
d.C::_a = 10;
d._a = 10;
d._b = 1;
d._c = 2;
d._d = 3;
return 0;
}
虚基表是用存储偏移量的,用来计算D中虚基类A对象的位置
关系模型:黄色为C
如果没有虚继承,关系模型为
总结:
1、虚函数:概念:虚函数重写是多态的条件之一
多态的原理:虚函数地址放到对象的虚表(虚函数表中),指向谁就调用谁的虚函数
2、虚继承:概念:解决菱形继承中的数据冗余和二义性
原理:将虚基类对象放到公共位置(看编译器可以放到头也可以放在尾部)