我理解到的app
隐藏,子类父类同名函数,参数不同就是隐藏(在子类中父类函数为不可见),即ide
class Fruit { public: void priName(int s) { cout<<"水果"<<endl; } }; class Apple :public Fruit { public: void priName(int a,int l) { cout<<"苹果"<<endl; } }; int main(int argc, char *argv[]) { Apple* apple=new Apple; apple->priName(0); /*父类中的priName(int) 为不可见 也就是隐藏 该处编译器报错,没法找打匹配的函数,但在 Apple中可用using priName 解决访问不了priName(int) */ return 0; }
参数相同时函数
class Fruit { public: void priName(int s) { cout<<"水果"<<endl; } }; class Apple :public Fruit { public: void priName(int a) { cout<<"苹果"<<endl; } }; int main(int argc, char *argv[]) { Apple* apple=new Apple; apple->priName(0);//参数相同,调用子类函数, ////////////*****///// Fruit* apple1=new Apple; apple1->priName(0); /*若是带有virtual 重写了 父类函数 那么调用 子类 即覆盖(override) 若是未重写 那么就是调用父类函数,也就是未覆盖, 若是不带virtual 直接就是隐藏 父类,调用子类的函数 */ return 0; }
/*******************************************************/ui
重载(overload)即便一个类中参数不一样的函数指针
/******************************************************************************/code
这几个概念都有一个共同点:函数名称相同,因此难免让人混淆,大体的区别以下:对象
重载:必须在一个域中,函数名称相同可是函数参数不一样,重载的做用就是同一个函数有不一样的行为,所以不是在一个域中的函数是没法构成重载的,这个是重载的重要特征继承
覆盖:覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,所以此时派生类的成员函数能够"覆盖"掉基类的成员函数.编译器
注意惟有同名且参数相同还有带有virtual关键字而且分别在派生类和基类的函数才能构成虚拟函数,这个也是派生类的重要特征.it
并且,因为是和多态挂钩的,因此只有在使用类对象指针或者引用的时候才能使用上.
总之一句话:覆盖函数都是虚函数,反之否则~~
隐藏:指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词能够这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,若是找到了那么就中止查找了,因此若是一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么咱们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义....
回到隐藏的定义中,前面已经说了有virtual关键字而且分别位于派生类和基类的同名,同参数函数构成覆盖的关系,所以隐藏的关系只有以下的可能:
1)必须分别位于派生类和基类中
2)必须同名
3)参数不一样的时候自己已经不构成覆盖关系了,因此此时是不是virtual函数已经不重要了
当参数相同的时候就要看时候有virtual关键字了,有的话就是覆盖关系,没有的时候就是隐藏关系了