类的继承和派生(自我总结)

在派生类中:

无论是哪种继承都不可以直接访问上一级类继承下来私有成员

  • 不可以直接访问
  • public
  • protected

对于protect和public则根据继承方式的不同而不同, 继承方式的不同限制的是派生类对象对基类的访问

在派生类内部中:

  • 无同名函数
    • 可以访问除开基类私有成员的任何成员
  • 有同名函数(同名就行)
    • 派生类中的同名函数隐藏基类中的同名函数
    • 可以通过类名::函数进行区分
    • 可能会引发二异性(继承来的函数同名[同一等级])

protected继承与private继承的差别:

  • protected不会继承到没有 ——
  • private会继承到不能访问
  • 只继承一次是看不出来差距的

类型转换

公有派生类对象(public方式)可以被当作基类的对象使用,反之则不可以.

  • 公有派生使得基类的对外访问接口是不变的
  • 派生类的对象可以隐含转换为基类对象;
  • 派生类对象可以初始化基类的引用
  • 派生类的指针可以隐含转换为基类的指针

通过基类对象名、指针只能使用从基类继承的成员

不要重新定义继承而来的非虚函数,使得同名函数被覆盖掉,使用虚函数更加满足多态需求

派生类不能继承的基类成员

缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数

构造函数

未继承基类构造函数,那么使用派生类构造函数进行统一初始化

C++11规定:

  • 可用using 语句继承基类的构造函数
  • 但是只能初始化从基类继承的成员
  • 语法形式:
    • using B::B;

复制构造函数与析构函数都是不被继承的,只会在需要的时候被调用。

复制构造函数一个派生类对象要被传递多次,中间会进行类型转换

析构函数与构造函数执行顺序相反

虚基类(与虚函数性质有些区别)

虚基类处理基类冗余的问题,虚函数处理函数动态绑定以区分调用的是那个函数

  • 虚基类————>虚继承,用virtual修饰第一次继承的继承方式,这样继承的就是指向该类的指针(形成虚基类)
  • 每个继承下来的虚基类都要被进行初始化(普通的不用)
  • 解决了冗余问题,但必须知道虚基类名以进行初始化
  • 最远派生类在被生成时,直接调用该虚基类,对虚基类只初始化一次

虚函数

  • 虚表是存在的,用来存放虚函数的入口地址(我怀疑有同名函数才会进入虚表,否则virtual就是一个标志)
  • 虚函数是动态绑定
  • 虚函数成员也有非静态成员函数的性质,会对同名的继承函数进行覆盖(无论述虚函数还是普通函数)
  • 如果跟基类虚函数同名,那么该函数除非返回类型以及参数类型及个数都一样才是虚函数,否则不是虚函数
  • 如果派生类中新定义了一个虚函数,且不与基类中的同名,那么通过基类指向派生类的基类指针或引用是找不到该虚函数的

总结:1.虚函数是用给继承中是同名函数的函数,以达到动态绑定效果,如果没有同名函数,那么带virtual与不带的差不多;
虚析构函数比较特殊,不用一样也能进入虚表

2.无论是虚函数还是虚析构函数,基类通过指针或者引用的情况才进行动态绑定,如果直接进行复制初始化,那么基类还是只调用基类的成员

猜你喜欢

转载自www.cnblogs.com/Liberavi/p/11735138.html