C++的答辩复习记录-04

文章详细阐述了C++中的继承概念,包括公有、保护和私有派生的特性,以及派生类如何访问基类成员。派生类可以增加新成员、重载或重定义基类函数,但不能继承析构函数、友元函数和静态成员。构造和析构的顺序被详细说明,强调了构造函数初始化列表的重要性,同时也提到了虚继承解决多继承时的二义性问题。
摘要由CSDN通过智能技术生成
  1. 公有(public)继承保护(protected)继承私有(private)继承,也称为公有派生保护派生私有派生
    (1)不改变基类成员在派生类中可访问权限;
    (2)派生类中自定义函数成员不能直接访问基类的private成员,只能可通过基类的public函数成员或protected函数成员访问基类的private成员;
    
    (1)基类的所有成员(包括public成员)在派生类中都是private私有的,不再是派生类的公有接口函数,不能被派生类的外部函数访问;
    (2)派生类的函数成员不能直接访问基类的private成员,但可以访问基类的public成员和protected成员,并且通过它们访问基类的private成员。
    
    (1)基类的public成员在派生类中  将变成protected成员;
    (2)基类的protected和private成员在派生类中  将保持原来的访问权限。
    
    
  2. 如果不想让一个类作为其它类的基类,可以用final关键字阻止它被继承。
  3. 基类和派生类
    派生类在基类的基础上可实施以下改变:
    1) 增加新的成员(数据+函数)。
    2) 重载(overload)基类的函数成员。
    3) 重定义(override,覆盖)基类已有的函数成员。
    4) 改变基类成员在派生类中的访问属性。
    
    派生类不能继承基类的以下内容:
    1)析构函数。
    2)基类的友元函数。
    3)静态成员(数据+函数) 
    4)针对基类定义的一些特殊运算符,如new等。
    基类的构造函数C++11之前不能继承,之后可以继承;
    
    派生类继承了基类的所有成员,但派生类能够直接访问从基类继承来的公有和保护成员,且只能通过这两类成员访问从基类继承来的私有成员。
    
    
  4. 访问限制Ⅰ
    派生类对基类(子对象)成员的访问形式
    (1) 通过派生类对象直接访问基类成员 
    Derived d;
    cout<<d.j;         d.fn2();
    (2) 在派生类函数成员中直接访问基类成员 
    Derived d;
    d.fn3();
    (3) 通过基类名字限定访问被重载或重定义的基类成员名
    Derived d;
    d.Base::fn1(); 
    
    using与隐藏函数重现   
    1)派生对基类同名成员的隐藏
    如果基类某个函数成员具有多个重载的函数版本,派生类又定义了同名成员,就会隐藏基类同名的全部重载函数。
    2)如何访问隐藏成员?
    一是使用基类名称限定要访问的函数成员
    重载基类的所有同名函数,而这些重载函数的代码与基类完全相同
    用using声明使基类重载函数在派生类中可见。用法如下:
     using 基类名称::被隐藏函数成员名;
  5. 静态成员
    基类静态成员为继承层次结构所有类共享;
    在继承体系中,如果基类定义了静成成员,则在整个继承体系中只有该成员的唯一定义,不论从该基类派生出了多少个或多少层次的派生类,静态成员都只有一个实例,为整个继承体系中的全体对象所共用。
    
  6. 类域
    1)类域
    每个类都建立了属于自己的作用域,本类的全体成员都位于此作用域内,而且相互之间可以直接访问,不受定义先后次序的影响。
    例如,一个函数成员可以调用在它后面定义的另一个函数成员。
    2)派生类类域
    派生类的作用域嵌套在基类作用域的内层。
    在解析类成员名称时,如果在本类的作用域内没有找到,编译器就会接着在外层的基类作用域内继续寻找该成员名称的定义。
    
  7. 构造顺序&析构顺序
    关于构造和调用顺序的说明
    (1)基类构造顺序由派生层次决定:最远的基类最先构造;
    (2)对象成员的构造顺序与它们的定义顺序符合;
    (3)构造函数构造;
    (4)析构函数的析构顺序与构造顺序相反;
    
  8. 派生类只能采用“构造函数初始化参数列表”的方式基类对象成员的构造函数传递参数
  9. 基类对象成员所属类只含有带参数的构造函数时。即使派生类本身没有数据成员要初始化,它也必须定义构造函数
  10. 当同时存在直接基类间接基类时,每个派生类的构造函数只负责其直接基类的构造
  11. 当派生类存在虚基类时,所有虚基类都由最后的派生类负责初始化
  12. 基类具有多个重载构造函数,或构造函数具有较多参数,而派生类又没有数据成员需要初始化,但它却必须提供构造函数,其唯一目的为基类构造函数提供初始化值在这种情况下派生类可以继承直接基类的构造函数
    using Base::Base;            //继承基类构造函数
  13. 当有多个基类时,将按照它们在继承方式中的声明次序调用;当有多个对象成员时,将按它们在派生类中的声明次序调用;当构造函数初始化列表中的基类对象成员的构造函数调用完成之后,才执行派生类构造函数体中的程序代码
  14. 虚拟继承->派生类间接继承同一基类,使得间接基类(Person)在派生类中有具有多份拷贝,引发二义性。[使得派生类中只存在同一基类的一份拷贝,解决了基类 数据成员的二义性问题]
  15. Ø最终派生类总是:(1)先调用虚基类的构造函数,(2) 再调用非虚基类的构造函数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值