微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

已删除的函数“虚拟类名::~类名”覆盖未删除的函数 VIRTUAL DESTRUCTOR

如何解决已删除的函数“虚拟类名::~类名”覆盖未删除的函数 VIRTUAL DESTRUCTOR

我试图在这代码中找到问题,它不能在 C++14 中编译。

最初的问题是使这个编译“不编辑对象或修改 drawObject() 的原型”:

#include <iostream>

class Object {
    virtual ~Object() {}
};

class Line : public Object {
public:
    virtual void draw() {std::cout << "draw" << std::endl;}
    ...
};

void drawObject(Object * obj) {
    obj->draw();
}

int main() {
    Line line;
    drawObject(&line);
}

所以我将 obj 强制转换为 Line,然后在 Object 的析构函数中遇到了另一个问题,因为它是私有的。

我想我需要定义 Line 类的析构函数,但没有这样做。

另外,我不允许编辑 Object 类(显然...)和 drawObject() 的原型。

#include <iostream>

class Object {
    virtual ~Object() {}
};

class Line : public Object {
public:
    virtual void draw() {std::cout << "draw" << std::endl;}
};

void drawObject(Object *obj) {
    ((Line*)obj)->draw();
}

int main() {
    Line line ;
    drawObject(&line);
}

我得到的错误

     error: deleted function 'virtual Line::~Line()' overriding non-deleted function

解决方法

私有析构函数意味着类不能是基类。派生类的构造函数(以防初始化引发异常)和析构函数都隐式使用基类析构函数。

因此您绝对无法从 Line 推导出 Object。您能做的最好的事情是让 LineObject

无关
class Line {
// ...
};

并在通话现场进行演员表

drawObject((Object*)&line);

但这是非常糟糕 C++ 的一个例子。虽然指向类的不相关指针之间的 reinterpret cast(这种 C 样式转换相当于)通常是合法的(指针应该具有相同的大小和表示形式,并且禁止任何扩展的对齐规范),并且虽然您可以转换回来,这完全忽略了类型系统并将所有谨慎抛诸脑后。

不要在酒吧测验和愚蠢的谜语之外复制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。