zoukankan      html  css  js  c++  java
  • 第十六章 多态性(一) 简单

    //第一节的内容是多重继承,由于前面在继承那一章已经粗略地了解了多种继承,所以本节及后面几节主要是说明"为什么要使用多重继承"
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	void smart()
    	{
    	   cout<<"父亲很聪明"<<endl;
    	}
    	//由于父亲不美丽,所以该类中的beautiful函数什么功能都没有,只是起到一个接口的作用,
    	//目的是为了让son类来继承
    	virtual void beautiful(){}
    
    	virtual ~father(){cout<<"析构father"<<endl;}
    };
    
    
    class son:public father
    {
    public:
    	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
    	~son(){ cout<<"析构son"<<endl; }
    };
    
    int main()
    {
    	father *pf;
    	int choice = 0;
    	bool quit = false;
    	while(quit == false){
    		cout<<"(0)退出 (1)父亲 (2)儿子"<<endl;
    		cin>>choice;
    		switch(choice)
    		{
    		case 0:
    			quit = true;
    			break;
    		case 1:
    			pf = new father;
    			pf->beautiful();
    			break;
    		case 2:
    			pf = new son;
    			pf->beautiful();
    			pf->smart();
    			delete pf;
    			break;
    		default:
    			cout<<"请输入从0到2之间的数字"<<endl;
    			break;
    		}
    		if(quit)
    		{
    			break;
    		}
    	}
        return 0;
    }*/
    
    //2 在派生类中增加函数
    //假如我们不想使用多重继承,又不想在基类中添加多余的接口函数,那
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	void smart()
    	{
    	   cout<<"父亲很聪明"<<endl;
    	}
    	//由于父亲不美丽,所以该类中的beautiful函数什么功能都没有,只是起到一个接口的作用,
    	//目的是为了让son类来继承
    	//virtual void beautiful(){}
    
    	virtual ~father(){cout<<"析构father"<<endl;}
    };
    
    
    class son:public father
    {
    public:
    	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
    	~son(){ cout<<"析构son"<<endl; }
    };
    
    int main()
    {
    	father *pf;
    	int choice = 0;
    	bool quit = false;
    	while(quit == false){
    		cout<<"(0)退出 (1)父亲 (2)儿子"<<endl;
    		cin>>choice;
    		switch(choice)
    		{
    		case 0:
    			quit = true;
    			break;
    		case 1:
    			pf = new father;
    			//pf->beautiful();
    			break;
    		case 2:
    			pf = new son;
    			//pf->beautiful(); //father类已经没有beautiful()函数,所以这里不能访问
    			//只能用指针转换
    			dynamic_cast<son*>(pf)->beautiful();
    			//因此我们必须将基类指针强制转换为子类指针,这里要用到一个方法--dynamic_cast
    			//dynacic_cast的作用是对不同类之间的数据类型进转换,它可一个基类的指针转换成一个派生类的指针
    			pf->smart();
    			delete pf;
    			break;
    		default:
    			cout<<"请输入从0到2之间的数字"<<endl;
    			break;
    		}
    		if(quit)
    		{
    			break;
    		}
    	}
        return 0;
    }*/
    
    
    //3 使用多重继承
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	void smart()
    	{
    	   cout<<"父亲很聪明"<<endl;
    	}
    	//由于父亲不美丽,所以该类中的beautiful函数什么功能都没有,只是起到一个接口的作用,
    	//目的是为了让son类来继承
    	//virtual void beautiful(){}
    	father(){cout<<"构造函数father"<<endl;}
    	virtual ~father(){cout<<"析构father"<<endl;}
    };
    
    class mother
    {
    public:
    	virtual void beautiful(){cout<<"母亲很漂亮"<<endl;}
    	mother(){cout<<"构造monther"<<endl;}
    	virtual ~mother(){cout<<"析构mother类"<<endl;}
    };
    
    
    
    class son:public father, public mother
    {
    public:
    	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
    	son(){cout<<"构造son"<<endl;}
    	virtual ~son(){ cout<<"析构son"<<endl; }
    };
    
    int main()
    {
    	father *pf;
    	mother *pm;
    	int choice = 0;
    	bool quit = false;
    	while(quit == false){
    		cout<<"(0)退出 (1)父亲 (2)儿子"<<endl;
    		cin>>choice;
    		switch(choice)
    		{
    		case 0:
    			quit = true;
    			break;
    		case 1:
    			pf = new father;
    			break;
    		case 2:
    			pm = new son;
    			pm->beautiful();
    			delete pm;
    			break;
    		default:
    			cout<<"请输入从0到2之间的数字"<<endl;
    			break;
    		}
    		if(quit)
    		{
    			break;
    		}
    	}
        return 0;
    }*/
    
    //4 模拟抽像类
    /*
    #include <iostream>
    using namespace std;
    
    class Human
    {
    public:
    	Human(){cout<<"构造Human"<<endl;}
    	virtual void smart(){}
    	virtual void beautiful(){}
    	virtual ~Human(){cout<<"析构Human"<<endl;}
    };
    
    //将Human继承为
    class father : virtual public Human
    {
    public:
    	void smart()
    	{
    	   cout<<"父亲很聪明"<<endl;
    	}
    	father(){cout<<"构造函数father"<<endl;}
    	virtual ~father(){cout<<"析构father"<<endl;}
    };
    
    class mother: virtual public Human
    {
    public:
    	virtual void beautiful(){cout<<"母亲很漂亮"<<endl;}
    	mother(){cout<<"构造monther"<<endl;}
    	virtual ~mother(){cout<<"析构mother类"<<endl;}
    };
    
    
    
    class son:public father, public mother
    {
    public:
    	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
    	virtual void smart(){cout<<"儿子也很聪明"<<endl;}
    	son(){cout<<"构造son"<<endl;}
        virtual ~son(){ cout<<"析构son"<<endl; }
    };
    
    int main()
    {
    	//father *pf;
    	//mother *pm;
    	Human *p;
    	int choice = 0;
    	bool quit = false;
    	while(quit == false){
    		cout<<"(0)退出 (1)父亲 (2)儿子 (3)母亲"<<endl;
    		cin>>choice;
    		switch(choice)
    		{
    		case 0:
    			quit = true;
    			break;
    		case 1:
    			p = new father;
    			p->beautiful();
    			delete p;
    			break;
    		case 2:
    			p = new son; //这里产生了两义性,因为父亲和母亲类都是从人类来的,一分是从母类,一分是从父类
    			p->beautiful();
    			p->smart();
    			delete p;
    			break;
    		case 3:
    			p = new mother;
    			p->beautiful();
    			delete p;
    		default:
    			cout<<"请输入从0到2之间的数字"<<endl;
    			break;
    		}
    		if(quit)
    		{
    			break;
    		}
    	}
        return 0;
    }*/
    //最后我们需要注意的是,这个抽像类并不是真正的抽像类,它只是一个虚拟的抽像类,因为它的虚函数仍然有功能
    //那就是什么事也不做,真正的抽像类必须一个或者一个以上真正没有任何功能的虚函数,这个虚函数的存在仅仅是为了让它的子类来继承并
    //有功能,关于这一点将在下节课中讲解
    
    
    //5 纯虚函数与抽像类
    //一个虚函数通过初始化为0就变成了纯虚函数
    /*
    #include <iostream>
    using namespace std;
    
    class Human
    {
    public:
    	Human(){cout<<"构造Human"<<endl;}
    	virtual void smart()=0; //定义一个纯虚函数
    	//一个类可以有多个纯虚函数,包含有纯函虚函数的类叫抽像类
    	//注意一点,继承抽像类的子类,必须要定重新定义纯虚函数
    	//它不是上一节的那个模拟的抽像类,而是真正的抽像类
    	virtual void beautiful()=0;
    	virtual ~Human(){cout<<"析构Human"<<endl;}
    };
    
    //将Human继承为
    class father : virtual public Human
    {
    public:
    	virtual void smart()
    	{
    	   cout<<"父亲很聪明"<<endl;
    	}
    	virtual void beautiful(){cout<<"父亲很帅"<<endl;}
    	father(){cout<<"构造函数father"<<endl;}
    	virtual ~father(){cout<<"析构father"<<endl;}
    };
    
    class mother: virtual public Human
    {
    public:
    	virtual void beautiful(){cout<<"母亲很漂亮"<<endl;}
    	virtual void smart(){cout<<"母亲不太聪明"<<endl;}
    	mother(){cout<<"构造monther"<<endl;}
    	virtual ~mother(){cout<<"析构mother类"<<endl;}
    };
    
    
    
    class son:public father, public mother
    {
    public:
    	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
    	virtual void smart(){cout<<"儿子也很聪明"<<endl;}
    	son(){cout<<"构造son"<<endl;}
        virtual ~son(){ cout<<"析构son"<<endl; }
    };
    
    int main()
    {
    	//father *pf;
    	//mother *pm;
    
    	//Human *p = new Human; //这样是错误的
    
    
    	Human *p;
    	int choice = 0;
    	bool quit = false;
    	while(quit == false){
    		cout<<"(0)退出 (1)父亲 (2)儿子 (3)母亲"<<endl;
    		cin>>choice;
    		switch(choice)
    		{
    		case 0:
    			quit = true;
    			break;
    		case 1:
    			p = new father;
    			p->beautiful();
    			p->smart();
    			delete p;
    			break;
    		case 2:
    			p = new son; //这里产生了两义性,因为父亲和母亲类都是从人类来的,一分是从母类,一分是从父类
    			p->beautiful();
    			p->smart();
    			delete p;
    			break;
    		case 3:
    			p = new mother;
    			p->beautiful();
    			p->smart();
    			delete p;
    		default:
    			cout<<"请输入从0到2之间的数字"<<endl;
    			break;
    		}
    		if(quit)
    		{
    			break;
    		}
    	}
        return 0;
    }*/
    //在该例中,Human类仅仅起到了为派生类提供一个接口的作用,这个接口类的纯虚函数可以没有任何作用
    //派生类将这些纯虚函数继承过来,然后给予它不同的功能。
    //注意:抽像类不是一个实际的类,所以不能定义一个抽像是类的对像
    
    
    //需要你不可以定义一个抽像类的对像,但你能定义一个指向抽像类的指针
    //这样就可以的,p既是一个指向抽像类的指针,同时又是一个指向基类的指针,因此在程序编译或运行时
    //这个指针可以动态地指向子类的对像,从而实现程序的多态性
    
    
    
    //抽像类的实例
    /*
    #include <iostream>
    using namespace std;
    class Shape
    {
    public:
    	virtual double area()=0;
    };
    //三角形
    class Trigon: public Shape
    {
    protected:
    	double h, w;
    public:
    	Trigon(double H, double W)
    	{
    		h = H;
    		w = W;
    	}
    	double area()
    	{
    	    return h * w / 2;
    	};
    };
    //正方形
    class Square : public Trigon
    {
    public:
    	Square(double H, double W):Trigon(H, W)
    	{ }
    	double area(){return h*w;}
    };
    
    //圆
    class Circle: public Shape
    {
    protected:
    	double radius;
    public:
    	Circle(double r){radius = r;}
    	double area(){ return radius * radius * 3.14; }
    };
    int main()
    {
    	Shape *p;
    	int choice = 0;
    	while(1)
    	{
    	     bool quit = false;
    		 cout<<"(0)退出 (1)三角形 (2)正方形 (3)圆"<<endl;
    		 cout<<"请选择"<<endl;
    		 cin>>choice;
    		 switch(choice)
    		 {
    		 case 0:
    			 quit = true;
    			 break;
    		 case 1:
    			 p = new Trigon(5.0,6.0);
    			 cout<<"三角形的面积是:"<<p->area()<<endl;
    			 break;
    		 case 2:
    			 p = new Square(70.0,70.0);
    			 cout<<"正方形的面积是:"<<p->area()<<endl;
    			 break;
    		 case 3:
    			 p = new Circle(9.0);
    			 cout<<"圆的面积是:"<<p->area()<<endl;
    			 break;
    		 default:
    			 cout<<"请输入0到3之间的数字"<<endl;
    			 break;
    		 }
    		 if(choice < 4 && choice > 0){
    		    delete p;
    		 }
    		 if(quit == true){
    		     break;
    		 }
    	};
        return 0;
    }*/
    

      

  • 相关阅读:
    hdu 4777 树状数组+合数分解
    hdu5635 BestCoder Round #74 (div.2)
    hdu 5636 搜索 BestCoder Round #74 (div.2)
    hdu 5637 BestCoder Round #74 (div.2)
    hdu4605 树状数组+离散化+dfs
    hdu4521 线段树+dp
    hdu3340 线段树+多边形
    孜孜不倦,必能求索;风尘仆仆,终有归途。
    增加、删除类文件或者在一个类中增加、删除方法时,是不能够热部署到服务上的。这时候需要停止服务器重新部署后再启动,就不会出现上面的提示了。
    为什么jdk1.8不支持sql.append,该如何解决
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2607485.html
Copyright © 2011-2022 走看看