20170812_继承与多态测试实例
/*多态测试
*/
#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
//基类Base
class base
{
public:
void fun()
{
cout<<"I am base::fun()!"<<endl;
}
virtual void test()
{
cout<<"I am base::test()!"<<endl;
}
};
//派生类child
class 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(); //base
baseobject1.test(); //base
class child childobject1;
childobject1.fun(); //child
childobject1.test(); //child
cout<<endl;
//2、指针调用:不是多态!
class base baseobject2;
class base *p_baseobject2=&baseobject2; //基类指针指向基类对象:
p_baseobject2->fun(); //base
p_baseobject2->test(); //base
class child childobject2;
class child *p_childobject2=&childobject2; //派生类指针指向派生类对象:
p_childobject2->fun(); //child
p_childobject2->test(); //child
cout<<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()!
*/