c++ - 是否可以识别不需要的虚函数覆盖?

标签 c++ compiler-construction virtual-functions overriding

<分区>

例如:

struct A
{
    virtual void go() { };
};

struct B : public A
{
    void go() { };
};

函数 go 的隐式覆盖可能是不可取的,因为无法识别 B::go() 隐藏或覆盖结构 的相同功能A甚至可能是struct A中不存在的新函数。 C++11 的 override 特性在你想要覆盖虚函数时很有用,但在我的例子中这是不可取的,我不想覆盖函数 go(),这意味着如果我知道有一个虚函数,我就不会在结构 B覆盖它。

我想要的是类似 [[check_names]] attribute proposal 的东西不同意 C++11。 C++ 有它的语言特性吗?

顺便说一句,编译器(例如 GCC 和 VC++)是否有显示警告的选项(如果错误不可用,警告就足够了!)如果发生了对虚函数的隐式覆盖?如果他们有,你能提供一个 GCC 的例子吗?

编辑:我不是在谈论强制或语言功能,我想要的只是一个警告或任何能让我识别不受欢迎的覆盖的东西。

编辑:什么可以是理想的覆盖?它可以类似于以下代码:

struct A
{
    virtual void go() { };
};

struct B : public A
{
    virtual void go() { };
};

或:

struct A
{
    virtual void go() { };
};

struct B : public A
{
    void go() override { };
};

或使用属性进行类似操作。

最佳答案

我想你可以使用标记,

#include <iostream>
#include <memory>

using namespace std;

struct no_override_tag
{};

struct A
{
    virtual void go() { cout <<"A::go" << endl;};
};

struct B : public A
{
    void go(no_override_tag={}) { cout << "B::go" <<endl; };
};

int main()
{
    unique_ptr<A> upA(new B);
    upA->go(); // no override, calls `A::go()` instead of `B::go()`


}

基本上,您添加类型为 no_override_tag 的默认初始化参数作为 B::go() 中的最后一个参数,这将使 的签名>B::go 不同,无论您在 A 中声明什么。不是 super 优雅,但它有效,但我不知道你为什么真的想这样做。

关于c++ - 是否可以识别不需要的虚函数覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999461/

相关文章:

尝试编译时 C# 换行常量错误

c - IS_ERR() 宏的有效使用

c++ - C++ 中的求和类型

java - 为什么所有 java 方法都是隐式可覆盖的?

c++ - CreateRemoteThread - ERROR_ACCES_DENIED

Java找不到符号

c++ - SDL 1.2.15 扩展面问题

子类中未调用 C++ 虚函数

c++ - 如何测试列表或 forward_list 的迭代器(包括尾部迭代器和开始前迭代器)保持有效,

c# - 使用 USB 激活 MOSFET/继电器