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