【封装】突破c思想,用类做函数参数时调用对象的属性和方法
【继承】意义:复用前人代码
private: 1.该类中的函数、2.其友元函数访问, 不能被任何其他访问,该类的对象也不能访问。
protected:1.该类中的函数、2.子类的函数、 3.其友元函数访问, 但不能被该类的对象访问。
public: 1.该类中的函数、2.子类的函数、 3.其友元函数访问, 4.该类的对象访问。
private 属性不能够被继承。
【多继承】始终存在问题
菱形继承(由继承树变成图,灾难)
1、公共祖先(菱形上部分)解决:虚继承 class A:virtual public B,底层原理:加上virtual关键词后c++编译器会给变量增加属性,类的size会增加一个指针大小vptr
2、两个父类中有相同的属性(菱形下部分),子类无法判断是哪一个父类的属性:类作用域符显式调用
【多态】意义:前人(基类)可以用后人(未来)的代码
父类的指针和引用指向自类,Base * p = child(),当父类和子类中有重名函数,p会调用基类的函数
多态实现:在父类的同名函数前加virtual关键字,实现一种语句多种形态,即父类指针指向不同的子类时,调用对应子类的重名函数。
多态成立条件:1、继承2、虚函数重写3、父类指针(引用)指向子类对象
实现原理:1、类成员(struct)和类函数分开存储,函数隐藏this指针,当用父类指针指向子类对象,调用函数时,传入指针类型的this指针(父类this),通过this指针调用子类函数
2、父类子类对象分别有虚函数表,运行时,动态编译,c++编译器根据指针指向的对象找到虚函数表,并从虚函数表找到函数入口地址
3、vptr分步初始化,子类初始化,先调用父类构造函数,c.vptr指向父类的虚函数表->父类构造函数运行完后c.vptr指向子类的虚函数表
表现:子类初始化过程,在父类构造函数中调用虚函数,调用父类的虚函数
虚函数寻址会降低效率,不要用太多
应用:aop,回调
【虚析构函数】
通过父类指针 指向的子类对象,调用析构函数时不会发生多态,只会按照指针类型调用父类析构函数
虚析构函数能够通过父类指针 把它指向的子类对象的析构函数都执行一遍,释放所有子类资源
【重载 重写 重定义】
一个 类内部 重载,子类无法重载父类
父子两类之间的同名函数,虚函数重写,非虚函数重定义(子类覆盖父类的同名函数)