C++中有关类继承的知识

来源:互联网 发布:网络用语吃鸡什么意思 编辑:程序博客网 时间:2024/05/24 05:24

1、格式:class DeriveClassName:acess lable BaseClassName{};

 DeriveClassName:派生类(子类)名字

acess lable:继承类型(分为三种:private、protected、public)

BaseClassName:基类(父类)名字

2、继承类型:

    总结:继承类型会把基类中大于继承类型的都变成继承类型,小于的保持不变。(public>protected>private)

3、在Class中若继承类型未给出则系统默认为private,在struct中则默认为public,跟成员类型一样。

4、对象模型(各个成员在内存中的布局形式):基类在前派生类在后

基于模型可以引出赋值兼容规则:赋值指针/引用

5、成员函数调用顺序:

(1)构造函数:先调入派生类的构造函数但是不进入函数体的内部而是直接进入到基类的构造函数内,执行完基类的构造函数体,再转过来执行派生类构造函数体。

(2)析构函数:先调用派生类的析构函数并进入到函数体内部,执行完派生类的析构函数后再去执行基类的析构函数。

6、作用域:

(1)基类和派生类是两个不同的作用域。

(2)但派生类和基类有同名成员时,派生类将屏蔽基类对成员的直接访问,派生类优先访问派生类成员,要想访问基类成员则需要加上基类作用域,例:b.B::_d(b:派生类  D:基类  _d:相同的成员名)

注:上述所说的成员相同只是指名字与类型无关,若成员函数相同也是指函数名,与返回值和参数无关。

7、友元函数不能继承,

     静态成员变量可以

8、继承类型:

(1)单继承:一个派生类只能有一个基类

(2)双继承:一个子类可以有两个基类

(3)菱形继承:示意图如下:

9、因为菱形继承具有一定的缺陷就是具有二义性。所以引用了虚拟继承的概念。

虚拟继承与普通继承的区别:

(1)书写模式:虚拟继承有virtual关键字

(2)对象模型:a.多了四个字节--->存放  偏移量表格(两行,第一行存放对象相对于自己的偏移量,第二行存放对象相当于基类成员的偏移量)  的地址

                           b.成员存放时派生类在前基类在后,与普通继承正好相反

(3)基类成员的访问:普通:直接访问

                                      虚拟:偏移量表格地址--->偏移量表格内的相对于基类成员的偏移量--->访问基类成员

(4)构造函数:a.派生类的构造函数--->将偏移量表格的地址存放在对象的前四个字节处。

                           b.多了一个参数“1”--->检测是否为虚拟继承,如果为一则是虚拟继承,如果是0则为普通继承。

10、虚拟继承的菱形继承格式:

class B {}; 

class C1:virtual public B {}; 

class C2:virtual public B {};

class D:public C1,public C2 {};

存在的缺陷为:直接访问,间接效率低


以上有什么不对的地方恳请指正,谢谢。


原创粉丝点击