C++学习笔记13:多态、继承笔记再再再整理3

16号晚上把这部分写完,论文下载好,大致看一下 ,就开始看Linux系统编程,网络编程7+7加油呀


【1】继承

    继承的本质:代码复用
    1.继承的访问限定?
    三类继承public、protected、private继承分别:
    2.派生类怎么初始化从基类继承来的成员?
    通过调用基类相应的构造函数进行初始化,派生类只会初始化自己的成员
    3. 构造析构的顺序?
    先基类再派生类,析构于构造相反

【2】多态

    1.什么是多态?
    静态多态:函数重载和模板(编译器的绑定)
    动态多态:虚函数(运行时绑定)
    
    2.多态的好处
    通过基类指针指向派生类对象,调用派生类的同名覆盖方法,基类指针指向哪个对象就调用哪个派生类的虚函数表中的方法
    
    3.重载 隐藏 覆盖(基类和派生类同名成员函数之间的关系)
    重载:函数名相同,参数列表不同,再同一个作用域
    隐藏:处在基类和派生类中,函数名相同
    覆盖:基类和派生类中,函数的返回值、函数名、参数列表都相同,而且基类的函数时virtual虚函数,称作覆盖关系(虚函数表的覆盖)
    
    4.请解释静态绑定(编译)(函数调用)和动态绑定(运行)?
    静态类型:对象在声明时采用的类型,再编译器已确定
    动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的
    静态绑定:直接绑定函数的地址,绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译器
    动态绑定:绑定虚函数表、寄存器,绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期,运行时确定
    
    5.vfptr vftable 什么时候生成?运行时加载到那一块内存??
    如果一个函数有虚函数,那么在编译阶段该类型会产生一个对应的虚函数表,用于存虚函数的地址;
    运行时加载到全局的数据段
    
    6.RTTI指针
    C++为了能够在运行时正确判断一个对象确切的类型,加入了RTTI和type_info.
    RTTI指针存储在虚函数表vftable中,指向一段类型字符串运行时的类型信息
    
    7.虚函数表
    存的内容:运行时的类型信息RTTI 偏移量 虚函数的地址
    存在的前提:此时已有对象 对象可以取地址
    
    8. 抽象类
    凡是含有纯虚函数的类叫做抽象类
    这种类不能定义对象,只是作为基类为派生类服务,但可以定义指针或引用
    除非在派生类中完全实现基类中所有的纯虚函数,否则派生类也变成了抽象类,不能实例化对象。
    在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向或引用子类对象
    
    9.虚函数的缺省参数(重点)
    虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的
class A
{
public:
    virtual void Fun(int number = 10)
    {
        std::cout << "A:: with number " << number<<endl;
    }
};
 
class B: public A
{
public:
    virtual void Fun(int number = 20)
    { 
        std::cout << "B:: with number " << number<<endl;
    }
};

int main()
{
    B b;
    A &a = b;
    b.Fun();
    a.Fun();
}


结果;
在这里插入图片描述
就是因为缺省参数是属于静态绑定的。https://blog.csdn.net/qtyl1988/article/details/37604011

【3】继承和多态的常见笔试题的分析

1.能不能成为虚函数=》记录函数地址(vftrbles)/vfptr (地址)
答:必须有对象已经存在 而且可以取地址

2.析构函数能不能实现成virtual虚析构函数?
答:可以的,此时已经有对象的存在

3.构造函数能不能实现成virtual虚构造函数?
答:不可以 因为这时候还没有对象

4.在构造函数中调用virtual虚函数,请问是静态绑定还是动态绑定?
答:静态绑定 因为此时没有产生对象 动态绑定依赖于对象 此时不能访问对象的前四个字节RTTI。

5.在析构函数中调用virtual虚函数,请问是静态绑定还是动态绑定?
答:是动态绑定,此时已经有对象的存在了。

6.static静态成员方法可不可以写成虚函数?
答:不可以 他的调用不依赖对象的存在

7.inline内联函数可不可以写成虚函数?
答:C++11新标准 已经可以写成虚函数 加virtual之后变成普通函数。
这pa why???

8.什么时候析构函数必须写成虚析构函数?
答:基类指针(引用)指向堆上派生类的的资源时,此时要把析构函数写成虚析构函数。

9.调用虚函数一定会发生动态绑定么?
不一定 对象的直接调用虚函数 永远是静态绑定
而指针或者引用调用虚函数的话才会发生动态绑定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值