重载,隐藏与虚函数

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

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

不同点:

  • 重载:在相同作用域同名函数,但传入参数不同没有特定关键字。需要小心传入参数的二义性。根据参数不同调用不同的函数。
    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();		//子类使用限定名调用父类函数
    }
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值