C++继承——特殊点

同名成员

当父子有相同的成员的时候,加上作用域::可以来选择访问具体的成员。

同名函数

如果子类中出现父类同名的函数,那么子类会隐藏掉父类的所有同名函数,如果想要访问的话也添加作用域就好了

同名静态成员

静态成员是在类初始化前就初始化,属于类外的东西,静态成员函数只能使用静态成员变量。

和同名成员、同名函数的处理方式是一样的。也是用作用域来处理。

多继承语法

多继承可能会引发父类中有同名成员出现,需要添加作用域区分,所以不太建议用多继承

class 子类: test1,test2,,,,,

当父类中出现同名的成员,也添加作用域处理就好了。

菱形继承

两个派生类继承同一个基类

又有某个类同时继承这两个派生类

这种继承被称为菱形继承,或者钻石继承

image-20210220205227852

菱形继承的问题

1 羊继承了动物的数据,驼也同样继承了动物的数据,当草泥马使用数据的时候,就会产生二义性

2 草泥马继承自动物的数据基础了两份,但是只需要一份就好了。

当出现菱形继承的时候,两个父类要访问用作用域区分就好

利用虚继承解决菱形继承的问题

在继承前添加关键字virtual,被继承的类就称为虚基类。

当产生了虚继承后,子类会在最前面的字节产生一个指针来虚基类表,虚地址表的前四个字节内容是该指针距离所在类的偏移,后四个字节的值为该指针和虚基类的偏移