重载、覆盖与隐藏——C++

来源:互联网 发布:vb api程序设计 编辑:程序博客网 时间:2024/05/16 03:49

重载:创建多个名称相同但特征标不同的方法(同类中)

覆盖:基类中某方法为虚函数,派生类中与该方法名和特征标相同(继承)

隐藏:当子类方法名与基类相同时,基类的方法被隐藏(继承)

#include <iostream>#include <string>using namespace std;class base{public://普通成员函数,被派生类完全相同的函数隐藏(因为不是虚函数所以是隐藏不是覆盖)void a(){cout<<"base a"<<endl;}void a(int){cout<<"base(int) a"<<endl;}    //虚函数,被派生类完全相同的函数覆盖virtual void b(){cout<<"base b"<<endl;}//虚函数,被派生类同名的函数隐藏(因为派生类中的c(int)多了一个参数所以不是覆盖,是隐藏)virtual void c(){cout<<"base c"<<endl;}//普通成员函数,被派生类同名的函数隐藏void d(){cout<<"base d"<<endl;} void e(){cout<<"base e"<<endl;}};class child:public base{public:    void a(){cout<<"chlid a"<<endl;}void b(){cout<<"child b"<<endl;}void c(int){cout<<"child(int) c"<<endl;}//隐藏基类c() c(int)是普通成员函数void d(int){cout<<"child(int) d"<<endl;}};int main(){base b,*p;child d,*c;    //如果基类指针指向基类对象,那p就与派生类没有关系了,相当于没有派生类的情况//基类对象调用方法用“.”cout<<"基类对象调用基类方法:"<<endl;     b.a();//输出:base a b.a(1);//输出:base(int) a b.b();//输出:base b b.c();//输出:base c b.d();//输出:base d b.e();//输出:base e //派生类对象调用基类方法,调用基类中不同特征标隐藏了的方法时,需加注基类名) cout<<"派生类对象调用基类方法:"<<endl; d.base::a(); //输出:base a     d.base::a(1);//输出:base(int) a //d.a(1);//基类中与派生类相同名方法,被派生类隐藏 d.base::b();//输出:base b d.base::c();//输出:base c //d.c(); d.base::d();//输出:base d //d.d(); d.e();//输出:base e //派生类对象调用派生类方法 cout<<"派生类对象调用派生类方法:"<<endl; d.a();//输出:child a d.b();//输出:child b d.c(1);//输出:child(int) c d.d(1);//输出:child(int) a     //基类指针指向了派生类对象(隐藏则调用基类的,覆盖则调用派生类的) cout<<"基类指针指向了派生类对象:"<<endl; p=&d;    p->a();//输出:base a p->a(1);//输出:base(int) a //p->child::a();//虽然p指针指向了派生类对象,当child::a()不是基类中方法 p->b();// 输出child b p->c();//  输出:base c p->d();//输出:base d p->e();//输出:base e //将基类指针强制转换成派生类指针(无论是覆盖还是隐藏都调用的是派生类的)     cout<<"将基类指针强制转换成派生类指针:"<<endl; ((child*)p)->a();//。输出child a ((child*)p)->base::a(); ((child*)p)->base::a(1); //((child*)p)->a(1);//被派生类隐藏,不可以直接调用,需加上基类名 ((child*)p)->b();//。输出child  b ((child*)p)->c(1);//输出child  c ((child*)p)->d(1);//输出child  d ((child*)p)->e(); //派生类指针不能指向基类对象     cout<<"派生类指针不能指向基类对象:"<<endl; c=&d;   //类指针必须初始化 c->a();   //输出child a c->b();   //输出child b c->c(1);  //输出child(int) c c->d(1);  //输出child(int) d//派生类指针如果想访问基类被隐藏的函数, 如下     cout<<"派生类指针如果想访问基类被隐藏的函数:"<<endl; c->base::a(); //输出base a c->base::a(1); //输出base(int) a c->base::b(); //输出base b c->base::c(); //输出base c c->base::d(); //输出base d c->base::e(); //输出base ewhile(1);return 0;}


0 0