• 纯虚函数的学习和使用


      老师的要求是给出shape类,派生出梯形,圆形,正方形和矩形4个类,然后根据他们的面积进行排序并且输出相应的信息。

      一开始我遇到了一个问题,我没有将4个派生类定义成数组,导致定义出来的某个类对象使用完之后就被抹除了,从而导致原先的基类指针数组的指向丢失。纯虚函数的工作原理就是指针指向这个类,所以这个类必须用数组保存起来,一旦被覆盖,指针的指向就会出现丢失或者紊乱的情况,但是经过我的观察,他好像指向最后 一次定义的对象,而是好像都是,但是具体里面是怎样实现的有待考究 。当时我还是一位是构造函数的问题,又写了set函数,又把构造删了之类的,后来发现完全不是这里的问题,而且这个地方的排序交换,我定义的id数组去模拟,而且直接交换指针对象也可以。

    一组样例如下:

    5
    c 3
    r 2 1
    s 5
    s 2
    t 1 2 5

    代码如下:

    #include<iostream>
    using namespace std;
    #define pi 3.14
    class Shape{
    public:
        virtual double area() = 0;
        virtual void show() = 0;
    };
    class Rec:public Shape{
    private:
        int l,w;
    public:
        void set(int ll,int ww){
            l = ll,w = ww;
        }
        double area(){
            return l*w;
        }
        void show(){
            cout<<"the rec's area = "<<area()<<endl;
        }
    };
    class Square:public Shape{
    private:
        int l;
    public:
        void set(int ll){
            l = ll;
        }
        double area(){
            return l*l;
        }
        void show(){
            cout<<"the Square's area = "<<area()<<endl;
        }
    };
    class Circle:public Shape{
    private:
        int r;
    public:
        void set(int rr){
            r = rr;
        }
        double area(){
            return pi*r*r;
        }
        void show(){
            cout<<"the Circle's area = "<<area()<<endl;
        }
    };
    class Tixing:public Shape{
    private:
        int l,w,h;
    public:
        void set(int ll,int ww,int hh){
            l = ll,w = ww;
            h = hh;
        }
        double area(){
            return (l+w)*h/2;
        }
        void show(){
            cout<<"the Tixing's area = "<<area()<<endl;
        }
    };
    int main(){
        int t,l,w,h;
        Square s1[110];
        Rec r1[110];
        Tixing t1[110];
        Circle c1[110];
        char op[10];
        Shape *s[110];
        int id[110];
        cin>>t;
        for(int i = 0;i < t;i++){
            cin>>op;
            if(op[0] == 's'){
                cin>>l;
                s1[i].set(l);
                s[i] = &s1[i];
            }
            else if(op[0] == 'r'){
                cin>>l>>w;
                r1[i].set(l,w);
                s[i] = &r1[i];
            }
            else if(op[0] == 'c'){
                cin>>l;
                c1[i].set(l);
                s[i] = &c1[i];
            }
            else {
                cin>>l>>w>>h;
                t1[i].set(l,w,h);
                s[i] = &t1[i];
            }
            id[i] = i;
        }
        for(int i = 0;i < t;i++){
            for(int j = 0;j < t;j++){
                if(s[id[i]]->area() < s[id[j]]->area())
                    swap(id[i],id[j]);
            }
        }
        for(int i = 0;i < t;i++){
            s[id[i]]->show();
        }
        return 0;
    }

      

  • 相关阅读:
    .netCore+Vue 搭建的简捷开发框架 (5)
    .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2
    Vue 学习笔记
    .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础
    .netCore+Vue 搭建的简捷开发框架 (3)-- Services层实现
    .netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用
    .netCore+Vue 搭建的简捷开发框架
    在线.net C#和vb.net 语言互转
    VB.net 通过句柄操作其他窗口
    vb.net 多线程爬虫抓取免费代理IP
  • 原文地址:https://www.cnblogs.com/jifahu/p/5543620.html
Copyright © 2020-2023  润新知