C++ 继承

什么是继承?

     继承就是在已经存在的一个类的基础上建立一个新类,即一个类从已经存在的类那里获得它所有的特性就叫做继承。继承是面向对象中代码复用的重要手段,通过继承,我们可以访问公有的东西,实现各自不同的东西。

继承的使用

     字类必须继承父类所以的类成员,不可以选择性的继承。但是字类可以在父类的基础上进行必要的调整。父类的私有成员在字类中是不可以访问的。如果一些成员函数不想被父类的对象访问,但是可以被子类访问,我们可以使用protect定义它为保护成员。继承的方式有三种:公有继承,私有继承,保护继承。

公有继承

     公有继承保持is-a原则,即每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。

私有继承和保护继承

     保持has-a原则,父类的部分成员并非完全成为子类接口的一部分。不管是哪种继承方式,在子类内部都可以访问父类的公有和保护成员,但是不能访问父类的私有成员。默认的继承方式私有继承。

继承体系中的作用域

     在继承体系中,父类和字类都有自己独立的作用域,当子类中有与父类同名的成员函数时,子类自动屏蔽父类成员,这就是同名隐藏。

继承系统中的构造和析构顺序

     构造时:先调用父类构造函数,再调用子类构造函数。析构时:先调用子类析构函数,再调用父类析构函数。

菱形继承和多虚继承

     继承分单继承和多继承。如果一个子类只有一个父类则就是单继承。如果一个子类同时有多个父类那么就是多继承。
     多继承中的菱形继承******
     在菱形继承中因为子类继承了两份祖先中的成员,所以菱形继承中存在数据的二义性和数据冗余问题。可以通过虚继承来解决,虚继承的使用方法就是让祖先类的所有子类在继承的时候加上virtual关键字,这样的话在最终的子类中就只存在一份祖先类的成员。
菱形继承模型:在这里插入图片描述

类默认的六个成员函数哪些不能被继承?哪些不能申明为虚函数?

     我认为,构造函数和析构函数时不能被继承,因为,构造和析构函数是用来管理类成员的。其余4个成员函数都是组合而成的,他肯定不是继承,因为如果被继承的话,子类就没有必要生成自己的了。之所以说他是组合,这是因为子类的赋值运算符重载函数里面肯定要调用父类的赋值运算符重载。其他也是一样。
     不能声明为虚函数:
     1.构造函数:因为虚函数是用来处理对象的,而构造函数是构造对象的,对象还没产生,如果处理对象呢?
     2.内联函数:内联函数在程序的编译时才展开,在函数调用处用整个函数体去换,而虚函数是为了在继承后对象能够准确执行自己的动作,当virtual和inline同时使用时,会忽略inline。
     3.静态成员函数:静态成员函数对于整个类的继承体系只存在一份,随意的对象都共享着一份代码。
     4.友元和普通函数不能声明虚函数:只有类的成员函数才能声明为虚函数,友元函数和普通函数都不是。
     析构函数声明为虚函数的意义?
     我们在使用基类指向派生类的对象时,如果我们不把基类的析构函数声明成虚函数,那么派生类中的派生部分就无法完成析构。

虚函数可以是模板嘛?

     ‘模板类’中,可以使用虚函数,虚函数并不会影响类的多态。‘模板成员函数’不可以使用虚函数,因为,在实例化类的时候需要创建虚表,但是在模板类实例化之前不能确定虚函数模板会被实力化多少个,所以就无法创建虚表。

虚表什么时候产生?

     在C++ 中,virtual function可以在编译时获知。此外,这一组地址是固定不变的,执行期不可能新增或者替换。由于程序执行时,表格的大小和内容都不会改变,所以其构建和存取皆可以由编译器完全掌控,不需要执行期的任何介入。类对象的虚函数指针vptr是在运行阶段确定的。

虚表属于类还是属于对象?虚表存在哪?

     虚表是为了保证多态的重要方式,每个类拥有一个虚表,里面存了虚函数的地址,解决了函数覆盖问题。每个类对象前4个字节存放着指向该表的虚表指针。虚表存放的位置应该是在模块的常量段中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值