程序员面试宝典-第七章-类的隐藏、覆盖

来源:互联网 发布:知乎都是医学生恋爱 编辑:程序博客网 时间:2024/05/16 04:48

成员函数被重载的特征
相同的范围(比如在同一个类中);
函数名字相同;
参数不同;
virtual 关键字可有可无。

覆盖的是指子类函数覆盖基类函数
在不同的类内(分别位于子类和父类)。
同名同参。
基类的函数名前必须有virtual关键字。

隐藏指派生类的函数隐藏了基类的同名函数

如果派生类函数与基类函数同名,但参数不同,无论基类函数前是否有virtual修饰,基类函数被隐。

如果派生类函数与基类函数同名,参数也相同,但是基类函数前无virtual修饰,基类函数被隐藏。


class Base{public:    virtualvoid f(float x){ cout << "Base::f(float) " << x << endl; }    void g(float x){ cout << "Base::g(float) " << x << endl; }    void h(float x){ cout << "Base::h(float) " << x << endl; }};class Derived : public Base{public:    virtualvoid f(float x){ cout << "Derived::f(float) " << x << endl; }    void g(int x)  { cout << "Derived::g(int) " << x << endl; }    void h(float x){ cout << "Derived::h(float) " << x << endl; }};

Derived::f(float x)函数覆盖了基类Base::f(float x)函数。子父类同名同参,父类有virtual关键字
Derived::g(int x)  函数隐藏了基类Base::g(float x)函数。同名不同参,无论有无virtual修饰
Derived::f(float x)函数隐藏了基类Base::f(float x)函数。同名同参,且基类无virtulal修饰

#include<iostream>#include<string>using namespace std;class A{      public :      A(){}      void f(){cout<<'a'<<endl;}      virtual void g(){cout<<"invoke aaa"<<endl;}};class B:public A{        public:        B(){}        virtual void g(){cout<<"invoke bbb"<<endl;}        void f(){cout<<'b'<<endl;}};int main(){    A * a = new B;    A * b = new A;    B * c = new B;    a->f();    b->f();    c->f();    cout<<"-------------------------"<<endl;    a->g();    b->g();    c->g();}

结果是 

a
b    
invoke bbb 
invoke aaa
invoke bbb

            如果是隐藏的话  当你通过指针调用这个函数的时候,调用根据的是指针的类型
            如果是覆盖的话  当你通过指针调用这个函数的时候,根据的是指针指向的类型

0 0
原创粉丝点击