C++ C++;错误:未删除的函数无法覆盖已删除的函数

C++ C++;错误:未删除的函数无法覆盖已删除的函数,c++,C++,我分别实现了以下基类和派生类 class-observer接口{ 公众: 虚拟无效更新(标准::字符串数据)=删除; 虚拟常量std::string&getUniqueID()=delete; 私人: //正在删除复制构造函数和复制运算符。 observer接口(const observer接口&)=删除; observerInterface&运算符=(const observerInterface&)=删除; }; class observer1 final:公共observerInterf

我分别实现了以下基类和派生类

class-observer接口{
公众:
虚拟无效更新(标准::字符串数据)=删除;
虚拟常量std::string&getUniqueID()=delete;
私人:
//正在删除复制构造函数和复制运算符。
observer接口(const observer接口&)=删除;
observerInterface&运算符=(const observerInterface&)=删除;
};
class observer1 final:公共observerInterface{
静态constexpr auto UNIQUE_ID=“observer1”;
公众:
无效更新(std::字符串数据)覆盖;
const std::string&getUniqueID()重写;
};
我面临以下错误:

未删除的函数覆盖已删除的函数“observer接口::*****”C/C++(1789)。
当我不删除基类中的
update
getUniqueID
方法时,问题就不存在了

知道我为什么会犯这个错误吗


我使用的是MSVC编译器版本:19.16.27032.1

您正在删除以下函数:

virtualvoid更新(std::string data)=删除;
虚拟常量std::string&getUniqueID()=delete;
编译器将删除这些函数并禁用它们的使用

如果您打算强制重写这些函数,则应改为使用:

virtualvoid更新(std::string data)=0;
虚拟常量std::string&getUniqueID()=0;
这意味着您将这些方法声明为纯虚拟的

纯虚拟函数
是一种不需要主体实现的
虚拟函数
(但是,类可以为此类函数提供
默认
实现),因此需要由派生类实现(这意味着纯虚拟成员函数必须始终由旨在具体化的派生类实现)

据我所知,您尝试派生您的
observerInterface
类,然后一个纯虚拟方法将适合您尝试执行的操作


有关和的更多详细信息。

此处您正在删除函数:

virtualvoid更新(std::string data)=删除;
虚拟常量std::string&getUniqueID()=delete;
编译器将删除这些函数并禁用它们的使用

如果您打算强制重写这些函数,则应改为使用:

virtualvoid更新(std::string data)=0;
虚拟常量std::string&getUniqueID()=0;
这意味着您将这些方法声明为纯虚拟的

纯虚拟函数
是一种不需要主体实现的
虚拟函数
(但是,类可以为此类函数提供
默认
实现),因此需要由派生类实现(这意味着纯虚拟成员函数必须始终由旨在具体化的派生类实现)

据我所知,您尝试派生您的
observerInterface
类,然后一个纯虚拟方法将适合您尝试执行的操作


更多细节,如果你想定义纯虚函数,请使用<代码>=0 < /C> >代替<代码> >删除< /C>。这是使用= 0和=删除之间的区别吗?“纯虚拟”是其他语言称为“抽象”的函数的C++名称。。删除的函数是一个完全不同的概念。

=delete
删除该方法。
=0
使其变得纯粹。列出它们相同的方式会更容易。
=0
因为虚拟函数使其纯粹(类抽象)。
=delete
(无论虚拟与否)使其被删除。这就是区别。;-)删除函数意味着从类中排除函数,如果(否则)编译器将在内部生成函数或(从基类)继承函数如果您想定义纯虚函数,请使用<代码>=0 < /C> >而不是<代码> >删除< /C>。这是有用的。使用= 0和= Delphi之间有什么区别?“纯虚拟”是其他语言称为“抽象”的函数的C++名称。。删除的函数是一个完全不同的概念。
=delete
删除该方法。
=0
使其变得纯粹。列出它们相同的方式会更容易。
=0
因为虚拟函数使其纯粹(类抽象)。
=delete
(无论虚拟与否)使其被删除。这就是区别。;-)删除函数意味着从类中排除函数,如果(否则)编译器将在内部生成或继承它(从基类)。“纯虚拟函数是没有实体实现的虚拟函数”-更准确地说,它是一个不需要实体的虚拟函数,但它可以有一个默认实体,如果后代愿意,可以调用该实体,但编译器不会抱怨该实体是否丢失。“因此需要由派生类实现”-是的,必须在派生类中重写纯虚函数。但是,如果基类确实提供了一个默认的主体,那么派生类将选择是否调用它。感谢@Remy(一如既往)的优秀评论。我增加了精度。:)“纯虚拟函数是一个没有实体实现的虚拟函数”-更准确地说,它是一个不需要实体的虚拟函数,但它可以有一个默认的实体,后代可以根据需要调用它,但编译器不会抱怨该实体是否缺失。“因此需要由派生类实现”-是的,必须在派生类中重写纯虚函数。但是如果基类确实提供了默认的主体,那么派生类将选择