例如:
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 { };
};
使用属性或类似的东西。
答案 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
。不是超级优雅,但它有效,但我不知道你为什么要真的这么做。