可以建立一个友元访问父类的隐私(doge
private可以类内访问和通过友元访问
公共权限类内外都能访问
友元可以实现访问私有属性,实现方式:
1.全局函数友元
2.类做友元
3.成员函数做友元
子类对象可以直接访问子类中的同名成员,如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名的成员函数
因为子类还没有创建有参函数,而父类创建有参函数,所以当子类传参数时,系统隐藏了父类有参函数,所以子类无法识别参数才报错,如果子类中创建有参函数接收就不会报错
如果想访问父类中被隐藏的同名成员函数,需要加作用域
(容易混淆的点:函数重载是同一个类中的函数同名不用参
继承同名静态成员处理方式:
类内声明,类外初始化:
因为静态成员相当于是放在全局区,所以要在类外初始化
非静态是栈区,运行完就释放
(上图最后一行可以直接采用 Son::m_A)
同名静态成员处理方式和非静态处理方式一样,但有两种访问方式(通过对象和通过类名)
多继承语法(C++吕布语法)
菱形继承(钻石继承)
概念:
1.两个派生类继承同一个基类
2.又有某个类同时继承着两个派生类
多态
动态多态目的就是告诉父类访问参数地址时直接访问调用参数的子类地址,哪个儿子访问就进哪个儿子地址
可以理解为父类的属性包含于子类,所以可以这样引用
地址早绑定,在编译阶段确定函数地址
如果想执行猫说话而不是动物父类说话,那这个函数地址就不能提前绑定,要在运行阶段进行绑定,即地址晚绑定
因为这里doSpeak函数需要重载,不然你也可以再写个doSpeak(Cat &cat)或者doSpeak(Dog &dog),只是那样代码就冗余了
virtual就是一个指针,在继承的时候应该讲过,同理,成员函数最后会变成普通函数,变为普通时会多一个指针变量,指针是指向调用的类的!
如果猫狗没有这个函数就会执行动物的
动态多态满足条件:
1.有继承关系
2.子类要重写父类的虚函数
重写:
函数返回值类型、函数名、参数列表 完全形同
子类重写是virtual可写可不写,而父类加上 virtual 这个关键字才能让父类变成一个虚函数
虚函数解决的最大问题:让基类指向子类
动态多类使用:父类的指针或者引用,执行子类对象
子类已经继承了父类的虚函数
派生类可以继承父类中的虚关键字,所以cat的speak为虚的
当父类的指针或者引用指向子类对象时,发生多态
Animal &animal = cat;
animal.speak();
c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。