20170812_继承与多态测试实例

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()!

*/








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值