涼宮こなた 2017-09-12 15:11 采纳率: 100%
浏览 1042
已采纳

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

  • 写回答

2条回答

  • Ning_Yin 2017-09-13 01:49
    关注

    一楼说的不对。

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

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能