• c++/oop虚函数与多态的应用


    c++/oop---虚函数与多态的应用

    在写大程序的时候,比如魔兽

    可以先定义基类:

    Creature

    然后再定义基类的n个派生类:

    Lion Wolf Iceman

    如果这些派生类之间可以互相作用:战斗等

    那么每一个派生类有与其他n-1个派生类的战斗函数,很复杂

    使用多态的时候,只需要再基类里面实现

    Virtual attack

    Virtual Hurt

    然后再在每一个派生类中实现

    Virtual attack

    Virtual Hurt

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef double db;
    int n;
    const db PI=acos(-1);
    class Cshape{
    public:
    	virtual db area()=0;
    	virtual void print()=0;
    };
    class Crectangle:public Cshape{
    public :
    	int w,h;
    	virtual db area(){
    		return w*h;
    	}
    	virtual void print(){
    		printf("Rectangle w=%d h=%d S=%lf\n",w,h,area());	
    	}
    };
    class Ccircle:public Cshape{
    public :
    	int r;
    	virtual db area(){
    		return PI*r*r;
    	}
    	virtual void print(){
    		printf("Circle r=%d S=%lf\n",r,area());	
    	}
    };
    class Ctriangle:public Cshape{
    public :
    	int a,b,c;
    	virtual db area(){
    		db p=(a+b+c)/2.0;
    		return sqrt(p*(p-a)*(p-b)*(p-c));
    	}
    	virtual void print(){
    		printf("Triangle a=%d b=%d c=%d S=%lf\n",a,b,c,area());	
    	}
    };
    Cshape * a[102];
    bool cmp(Cshape * A,Cshape *B){
    	return A->area()<B->area();
    }
    int main()
    {
    	scanf("%d",&n);
    	Crectangle *pr;
    	Ccircle *pc;
    	Ctriangle *pt;
    	for(int i=1;i<=n;i++){
    		char t;scanf(" %c",&t);
    		if(t=='R'){
    			pr=new Crectangle();
    			scanf("%d%d",&pr->w,&pr->h); 
    			a[i]=pr;
    		}
    		if(t=='C'){
    			pc=new Ccircle();
    			scanf("%d",&pc->r);
    			a[i]=pc;
    		}
    		if(t=='T'){
    			pt=new Ctriangle();
    			scanf("%d%d%d",&pt->a,&pt->b,&pt->c);
    			a[i]=pt;
    		}
    	}
    	sort(a+1,a+n+1,cmp); 
    	for(int i=1;i<=n;i++)a[i]->print();
    	return 0;
    }

    用多态实现多边形类

    常见写法:把开一个基类指针数组,指向不同的派生类对象

    另一种排序方法

    
    int Compare(const void * A,const void * B){
    	Cshape **p1=(Cshape**)A;
    	Cshape **p2=(Cshape**)B;
    	db a1=(*p1)->area();
    	db a2=(*p2)->area();
    	if(a1<a2)return -1;
    	if(a1>a2)return 1;
    	return 0;
    }
    
    
    qsort(a+1,n,sizeof(Cshape*),Compare);

    有点怪

    const void* 是一个不确定类型的指针

    实际上传入的是指向指针的指针(指向数组元素,而数组元素是指针)

  • 相关阅读:
    中文字,文本框,button按钮垂直居中对齐方法
    Denny_Yang的语录
    为SELECT结果集添加伪序号列
    考勤系统问题记录一:事务日志太大
    在DateTable中进行数据统计(不用循环)
    今天去游泳了
    关于HbSrv.exe
    有感于--特洛伊
    windows下DNS的问题
    Google新功能
  • 原文地址:https://www.cnblogs.com/liankewei/p/16027145.html
Copyright © 2020-2023  润新知