gpt4 book ai didi

C++ "Virtual functions but no virtual destructors"

转载 作者:IT老高 更新时间:2023-10-28 21:50:00 27 4
gpt4 key购买 nike

我有一个基类Media和几个派生类,即DVDBook等...基类写成:

class Media{
private:
int id;
string title;
int year;
public:
Media(){ id = year = 0; title = ""; }
Media(int _id, string _title, int _year): id(_id), title(_title), year(_year) {}
// virtual ~Media() = 0;
void changeID(int newID){ id = newID; }
virtual void print(ostream &out);
};

问题是:没有析构函数,GCC 给了我一堆警告class has virtual functions but non-virtual destructor,但仍然可以编译并且我的程序运行良好。现在我想摆脱那些烦人的警告,所以我通过添加一个虚拟析构函数来满足编译器,结果是:它没有编译,错误:

undefined reference to `Media::~Media()`

将析构函数设为纯虚拟并不能解决问题。那么到底出了什么问题呢?

最佳答案

您还需要定义虚拟析构函数,而不仅仅是添加它。

//Media.h
class Media{
//....
virtual ~Media() = 0;
};

//Media.cpp
#include "Media.h"
//....
Media::~Media() {};

您收到警告的原因是所有将派生的类都应具有虚拟或 protected (信用@Steve)析构函数,否则通过指向基类的指针删除实例会导致未定义的行为。

注意您必须为析构函数提供定义,即使它们是纯虚拟的。

关于C++ "Virtual functions but no virtual destructors",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10024796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com