进入原帖讨论:http://bbs.bccn.net/thread-76966-1-1.html 网上的关于重载、覆盖和隐藏到处都搜得到,但发现讲的都是什么是什么方式,并没有细讲到每一个要点,还有最近几个论坛发现有些人问这方面的问题,便写了一下自己的关点,供初学者学习.下面我们来讨论一下. [以下内容由作者stylev原创,如有转载,请注明] -------------------------------------------------------------------------------------------------------------------------- 重载(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 ----------------------------------------//如有错误或不明之处,请发电子邮件给我 
|