博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重载,隐藏与虚函数
阅读量:3960 次
发布时间:2019-05-24

本文共 1335 字,大约阅读时间需要 4 分钟。

这几天学了一下继承,对于这几个概念比较一下。如有错漏,还望大神指摘。

共同点:

重载、隐藏和虚函数,说的都是重名函数,即函数名相同。

不同点:

  • 重载:在相同作用域同名函数,但传入参数不同没有特定关键字。需要小心传入参数的二义性。根据参数不同调用不同的函数。
    class A{
    public: void test(){
    cout << "test void" << endl; } void test(int a){
    cout << "test int" << endl; }}
  • 隐藏:在基类和衍生类(不同作用域)中,同名函数,传入参数可以相同也可以不同,没有特定关键字。根据指定的作用域调用不同的函数,如用父类指针则调用父类中的函数,用子类指针则调用子类中的函数,子类若想调用父类函数必须使用限定名,否则无法调用。
    class A{
    public: void test(int a){
    cout << "A test" << endl; }}class B : public A{
    public: void test(){
    cout << "B test" << endl; }}void main(){
    B b, *p = &b; p->test(); //p为B类指针,因此会调用B中的test,输出"B test" ((A*)p)->test(1); //转化为A类指针后,会调用A中的test,输出"A test" ((A*)p)->test(); //无法跨作用域调用,A类中函数需要传入int参数,所以这里会编译出错 p->A::test(1); //子类使用限定名调用父类函数}
  • 虚函数:在不同作用域中同名函数传入参数必须相同virtual关键字。根据实例化的对象调用函数。如实例化一个子类对象,则无论用父类指针还是子类指针,都会调用子类中的函数。若想调用父类中的同名函数,需要使用限定名。
    class A{
    public: virtual void test(){
    cout << "A test" << endl; }}class B : public A{
    public: void test(){
    //父类中声明为虚函数的,继承的都是虚函数 cout << "B test" << endl; }}void main(){
    B b, *p = &b; p->test(); //输出"B test" ((A*)p)->test(); //无论使用什么样的指针调用,都会输出"B test" ((A)b).test(); //此处将b强制转化为A类,就变成了A类对象,所以会输出"A test" p->A::test(); //子类使用限定名调用父类函数}

转载地址:http://kxxzi.baihongyu.com/

你可能感兴趣的文章