C++初次使用虚函数出现报错不知如何处理

 #include<iostream>
using namespace std;

class shape
{
    public:
        virtual int area();

        shape()
        {
            cout<<"调用shape构造函数"<<endl;
        }

        ~shape()
        {
            cout<<"调用shape析构函数"<<endl;
        }
};



class rectangle:
    public shape
{
    private:
        int x;
        int y;
    public:
        void in()
        {
            cout<<"请输入矩形长宽"<<endl;
            cin>>x>>y; 
        }
        virtual int area();
        rectangle()
        {
            cout<<"调用rectangle构造函数"<<endl;
        }
        ~rectangle()
        {
            cout<<"调用rectangle析构函数"<<endl;
        }
};

class circle:
    public shape
{
    private:
        float r;
    public:
        void in()
        {
            cout<<"请输入圆形的半径"<<endl;
            cin>>r;
        }
        virtual int area();
        circle()
        {
            cout<<"调用circle构造函数"<<endl;
        }
        ~circle()
        {
            cout<<"调用circle析构函数"<<endl;
        }
};

class square:
    public rectangle
{
    private:
        int a;
    public:
        void in()
        {
            cout<<"请输入方形的边长"<<endl;
            cin>>a; 
        }
        virtual int area();
        square()
        {
            cout<<"调用square构造函数"<<endl;
        }
        ~square()
        {
            cout<<"调用square析构函数"<<endl;
        }
};

int main(void)
{
    circle c;
    rectangle r;
    square s;
    c.in();
    r.in();
    s.in();
    cout<<"圆形面积"<<c.area()<<endl;
    cout<<"矩形面积"<<r.area()<<endl;
    cout<<"方形面积"<<s.area()<<endl;
} 

int rectangle::area()
{
    return x*y;
}

int circle::area()
{
    return 3.14*r*r;
}

int square::area()

{
    return a*a;
}


编译时报错信息为:

C:\Users\Administrator\AppData\Local\Temp\ccLhjdDA.o In function shape::shape()':
10 C:\Users\Administrator\Desktop\未命名2.cpp undefined reference to
vtable for shape'
C:\Users\Administrator\AppData\Local\Temp\ccLhjdDA.o In function shape::~shape()':
15 C:\Users\Administrator\Desktop\未命名2.cpp undefined reference to
vtable for shape'
C:\Users\Administrator\Desktop\collect2.exe [Error] ld returned 1 exit status

一楼说的不对。

r是派生类的私有成员,派生类的成员函数可以访问。

从浮点型到整型,会有warning,但不会有error和fatal。

问题出在shape类的虚函数int area()只有声明,没有定义。

C++ Primer第5版中文版,536页:因为我们直到运行时才能知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义。通常情况下,如果我们不使用某个函数,则无需为该函数提供定义。但是我们必须为每一个虚函数都提供定义,而不管它是否被用到了,这是因为连编译器也无法确定到底会使用哪个虚函数。

int circle::area()
{
return 3.14*r*r;
}
这里有两个错误
一个r是私有的,派生类访问不了
一个是,这个结果是浮点,你却定义了int