重载、覆盖和隐藏之细谈

 最近几个发现有些人问这方面的问题加上自己在学这方面的知道,便找了点关于这方面的资料,供初学者学习.下面我们来讨论一下.

重载(overload)
这个好理解,在同个space域同名的.
参数必须不同,有关virtual无关.

--------------------------------------------------------------------------------------------------------------------------


覆盖(override)
同名字,同参数,有virtual

覆盖好理解比如show()函数
A派生了B
如果B中的show()覆盖了A中的show()
但B中仍然有两个show(),而不管是A类指针也好,B类对象调用也好,都只能调用B类自己的那个show();
而从A类继承过来的show()函数真的就被覆盖了,没有了吗? 答应是不对的.这时可以在B类对象显示的调用A类继承过来的show();

程序代码:
#include <iostream>
using namespace std;
class A
{
      public:
             virtual void show()
             {
                  cout << a << endl;
             }
             
             int a;
};
class B:public A
{
      public:
             void show()
             {
                  A::show();  
//显示的调用自己类中的 "由A类继承过来的show()函数"
//像这种直接显示指出某个类的某个函数时,
//编译器处理方式是这样的: 首先在自己类中找有没有A::show(),如果找到,调用.不在继续在A类中找
//如果找不到,则在显示指出的那个类中(即A类)调用那个函数. 这里当然是在B类中可以找到A::show()
//因为基类中指出了这个函数是virtual函数.
             }
             int b;
};

int main()
{
    A a;
    a.a = 3;
    a.show();
    B b;
    b.b = 4;
    b.show();
    b.A::show(); //显示的调用自己类中的 "由A类继承过来的show()函数"
    return 0;
}


总结:
virtual, 覆盖.
其实准确,通俗的讲B类还是有两个show(),只是调用由A继承过来的show()只能通过显示的调用方法 [类名::virtual函数名]
而不管是基类A的指针 (B b; A *p = &b; p->show())或者派生类的对象(B b; b.show()),都只能调用B类的自己本身存在的show()函数

-----------------------------------------------------------------------------------------------------------------------

隐藏hide
这个有点麻烦了...
什么是隐藏情况?
1,同名同参无virtual
2,同名不同参不管有无virtual

程序代码:
class A
{
     public:
           void show() {};  //编号1
           void rose(int a) {}   //编号2
};
class B:public A
{
     public:
           void show() {}; //编号3
           void rose(int a, int b) {};  //编号4
};

//
类B中的show()和rose()明显是隐藏了类A的show()和rose()
隐藏的理解:
B类中其实有两个show(),两个rose();
但为什么不叫重载呢?你会这样想,但我可以告诉你,因为类B中的两个show(),两个rose(),不是都可以被类B对象调用的.

//----1----//
编号1和编号2,在类B中哪怕存在,但只能通过类A的指针调用,而不能通过B类对象调用,如:

程序代码:
A *p = new B;
p->show(); 
p->rose(3);
p->rose(3,5); //error


//----2----//
编号3和编程4,只能通过类B对象调用,而不能通过类A的指针调用,如:

程序代码:
B b;
b.show();
b.rose(3,5);
b.rose(4); //error
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值