没见过的报错,也不给说哪里错了

问题遇到的现象和发生背景

为什么会有这种报错啊?
我如果想定义一个通用函数void fun(Shape *pt),
输出各自图形的周长和面积,该怎么写呢,求帮助

问题相关代码,请勿粘贴截图
#include<iostream>
using namespace std;
class shape {
    public:
        virtual double perimeter();
        virtual double area();
        virtual void display();
};
class circle:public shape {
    private:
        double r;
    public:
        circle(double R=0):r(R) {
        }
        double perimeter() {
            return 2*3.14*r;
        }
        double area() {
            return 3.14*r*r;
        }
        void display() {
            cout<<"圆形"<<endl;
        }
};
class rectangle:public shape {
    private:
        double a;
        double b;
    public:
        rectangle(double x=0,double y=0):a(x),    b(y) {
        }
        double perimeter() {
            return 2*(a+b);
        }
        double area() {
            return a*b;
        }
        void display() {
            cout<<"方形"<<endl;
        }
};
int main() {
    shape *p;
    p=new circle(3);
    p->display();
    p=new rectangle(2,4);
    p->display();
    system("PAUSE");
    return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

#include<iostream>
using namespace std;
class shape {
public:
    virtual double perimeter() { return 0.0; }
    virtual double area() { return 0.0; }
    virtual void display() {}
};
class circle :public shape {
private:
    double r;
public:
    circle(double R = 0) :r(R) {
    }
    double perimeter() {
        return 2 * 3.14 * r;
    }
    double area() {
        return 3.14 * r * r;
    }
    void display() {
        cout << "圆形" << endl;
    }
};
class rectangle :public shape {
private:
    double a;
    double b;
public:
    rectangle(double x = 0, double y = 0) :a(x), b(y) {
    }
    double perimeter() {
        return 2 * (a + b);
    }
    double area() {
        return a * b;
    }
    void display() {
        cout << "方形" << endl;
    }
};
int main() {
    shape* p;
    p = new circle(3);
    p->display();
    p = new rectangle(2, 4);
    p->display();
    system("PAUSE");
    return 0;
}

不是通用 是父类shape 定义一个抽象方法 子类继承并实现具体方法