是否可以识别虚拟功能的不良覆盖?

时间:2014-07-28 16:10:31

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

例如:

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

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

函数go的隐式重写可能是不可取的,因为B::go()隐藏或覆盖struct A的相同函数是不可识别的,甚至它可能是一个新函数在struct A中不存在。当你想要一个理想的虚函数覆盖时,C ++ 11的override特性很有用,但在我的情况下它是不可取的,我不想覆盖函数go(),这意味着如果我知道有一个虚拟函数我不会override在结构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 { };
};
使用属性

或类似的东西。

1 个答案:

答案 0 :(得分:1)

我猜你可以使用标记,

#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。不是超级优雅,但它有效,但我不知道你为什么要真的这么做。