20170812_继承与多态测试实例

来源:互联网 发布:李易峰睡杨幂 知乎 编辑:程序博客网 时间:2024/06/05 02:52

20170812_继承与多态测试实例


/*多态测试*/#include<iostream>#include<vector>#include<numeric>using namespace std;//基类Baseclass base{public:void fun(){cout<<"I am base::fun()!"<<endl;}virtual void test(){cout<<"I am base::test()!"<<endl;}};//派生类childclass child:public base{public:void fun(){cout<<"I am child::fun()!"<<endl;   //非虚函数fun,隐藏}virtual void test(){cout<<"I am child::test()!"<<endl;   //虚函数,重定义,覆盖}};int main(void){//1、对象调用:不是多态!(对象是谁的,就调用谁的函数,不管是不是虚函数!)class base baseobject1;baseobject1.fun();//basebaseobject1.test();//baseclass child childobject1;childobject1.fun();//childchildobject1.test();//childcout<<endl;//2、指针调用:不是多态!class base baseobject2;class base *p_baseobject2=&baseobject2;//基类指针指向基类对象:p_baseobject2->fun();//basep_baseobject2->test();//baseclass child childobject2;class child *p_childobject2=&childobject2;//派生类指针指向派生类对象:p_childobject2->fun();//childp_childobject2->test();//childcout<<endl;//3、指针调用:是多态!(基类指针指向谁,就调用谁的函数,派生类继承来的虚函数进行了重定义!)class child childobject3;class base *p_baseobject3=&childobject3;//基类指针指向派生类对象:p_baseobject3->fun();//base(非虚函数,基类指针指向的是派生类中的基类部分!)p_baseobject3->test();//child(虚函数,这就是:多态性!!!)cout<<endl;//4、上行转换:派生类指针—>基类指针(编译器默认是支持的,也即是可以隐式转换)//上行转换的效果:类似于多态。。。。。。class child childobject4;class child *p_childobject4=&childobject4;class base *p_baseobject4=static_cast<base *>(p_childobject4);p_baseobject4->fun();//base:因为是非虚函数,根据指针类型来调用,也就是根据指针所属的类的类型来调用。p_baseobject4->test();//child:因为是虚函数,根据指针所指向的对象来调用,调用该对象的函数。cout<<endl;//5、下行转换:基类指针->派生类指针(编译器不支持,需要显示强制类型转换)//下行转换的效果:跟上行转换反过来,是什么鬼?。。。。。。class child childobject5;class base *p_baseobject5=&childobject5;class child *p_childobject5=static_cast<child *>(p_baseobject5);p_childobject5->fun();//child:因为是非虚函数,所以根据指针类型来调用,也就是根据指针所属的类的类型来调用。p_childobject5->test();//child:因为是虚函数,所以根据指针所指向的对象来调用,调用该对象的函数。cout<<endl;system("pause");return 0;}/*答案输出:I am base::fun()!I am base::test()!I am child::fun()!I am child::test()!I am base::fun()!I am base::test()!I am child::fun()!I am child::test()!I am base::fun()!I am child::test()!I am base::fun()!I am child::test()!I am child::fun()!I am child::test()!*/