派生类中有与基类同名的成员,则优先使用派生类成员,要使用基类成员则要用classname::var(同名隐藏)
从不同基类中继承了同名成员,但派生类没有同名成员,使用则用域名限制
◇型继承,派生类中有同名成员,使用域名限制访问,但是同一变量会有两份,发生冗余,产生不一致性
解决二义性和冗余问题,则使用虚基类,virtual只保留棱型集成中的原始基类一份成员,但虚基类的构造函数初始化就要由最远派生类来初始化,中间各级的初始化虚基类就要被忽略
虚函数的作用:
1.为了使用类的指针方便传入参数,可把派生类型转化为基类,因为派生类包含基类,而基类不能转化为派生类。
2.这样做之后,如果有同名函数,在调用时候,传入参数,类型为基类类型,编译会静态绑定,使用基类的函数,而不使用随类型变换的不同的函数
3.解决静态绑定,就是在函数前加 virture,虚函数,不让在编译时候静态绑定,要在运行时候随类型变化而绑定,就达到了我们要的传入类型不同,调用对应类型的函数。
构造函数不能是虚函数,析构函数可以是虚函数
基类中的函数声明为虚函数后,在派生类的同样函数中,可以不声明,编译器也把他看做虚函数。为了可读性,要声明一下
4,析构函数的虚函数
如果希望使用基类指针调用对象的析构函数,则要声明基类的析构函数为虚函数,否则会不正确
5.抽象类:含有纯虚函数的类,virtual fun() = 0;
抽象类不能实例化,可以规定对外接口的统一形式,留给派生类去实现