Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于覆盖的GCC弃用消息_C++_Gcc_Overriding_Deprecated_Virtual Functions - Fatal编程技术网

C++ 关于覆盖的GCC弃用消息

C++ 关于覆盖的GCC弃用消息,c++,gcc,overriding,deprecated,virtual-functions,C++,Gcc,Overriding,Deprecated,Virtual Functions,在GCC中,当有人使用调用已弃用函数时,可以创建弃用警告 void __attribute__((deprecated)) foo() {} 当有人重写类的虚拟方法时,是否可以创建类似的弃用警告?它将生成错误而不是警告,但您可以在基类的方法声明中添加final说明符。那就没人能推翻它了 您还可以在运行时(而不是编译时)通过调用函数并查看它是否运行基类实现(通过在基类实现中设置一个标志,然后在调用后检查它)生成一条弃用消息。使用和标准属性(从C++14开始提供)在VisualStudio中使用不

在GCC中,当有人使用调用已弃用函数时,可以创建弃用警告

void __attribute__((deprecated)) foo() {}

当有人重写类的虚拟方法时,是否可以创建类似的弃用警告?

它将生成错误而不是警告,但您可以在基类的方法声明中添加
final
说明符。那就没人能推翻它了

您还可以在运行时(而不是编译时)通过调用函数并查看它是否运行基类实现(通过在基类实现中设置一个标志,然后在调用后检查它)生成一条弃用消息。

使用和标准属性(从C++14开始提供)在VisualStudio中使用不推荐的方法和尝试通过发出C4996警告(可以忽略)进行重写时,都会产生所需的效果。我不能代表其他编译器说话,我希望因为这是他们也应该遵守的标准

class Base
{
public:
    [[deprecated("dont use, deprecated")]] virtual void foo()
    {
    }
};

class Derived : public Base
{
public:
    void foo() override 
    {
    }
};


int main()
{
    Base b;
    b.foo();
}

这将产生两个警告,一个用于覆盖,一个用于尝试使用,

final
在这里没有用处,因为如果我破坏API,我可能会删除该函数。我可以调用派生类的特定方法的唯一保证位置是基类的构造函数。但是如果我这样做了,派生类还不会初始化,因此vtable方法可能会出错。更不用说被重写的方法可能具有的任何其他副作用了。@Vortico——从基类构造函数调用虚拟成员函数不会出错。它调用该函数的基类版本。@Vortico:完全删除该方法可能会在没有
override
说明符的情况下悄悄中断重写它的客户端。所以
final
比简单的删除要好。是的,你是对的,我错了,它调用基类的方法。但是你的检查测试总是会返回一个假阳性(因为派生类的方法从来没有被调用过。)关于
final
,这是一个很好的观点,但在我的例子中,调用方总是使用
override
(因为每个构建系统都使用
-Wsuggest override-Werror
).看起来这是一个副本,在提交之前我没有发现它。答案似乎是“不,你不能那样做”,就像许多与C++相关的问题一样。它只对clang和gcc进行调用: