【发布时间】:2014-07-28 16:10:30
【问题描述】:
例如:
struct A
{
virtual void go() { };
};
struct B : public A
{
void go() { };
};
函数go 的隐式覆盖可能是不可取的,因为无法识别B::go() 隐藏或覆盖了struct A 的相同函数,甚至它可能是struct @ 中不存在的新函数987654326@。 override C++11 的特性在你想要一个理想的虚函数覆盖时很有用,但在我的情况下它是不可取的,我不想覆盖函数 go(),这意味着如果我知道有一个 virtual函数我不会在 struct B 中使用 override 它。
我想要的是类似于 [[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 { };
};
或类似的使用属性。
【问题讨论】:
-
您想禁止在所有基类中覆盖吗?如果是这样,请使用
final。 -
功能隐藏不是bug,它是一个特性:-P
-
@Nasser 这不是那个 Q 的骗子。这里的问题是在类定义中检测覆盖。
-
@ccsadegh no answer 解决了它,因为目前似乎没有办法解决它,直到编译器实现它。如果您查看 G++、Visual Studio 和 clang 警告列表,则没有此类警告标志。
-
@BenVoigt 是对的,但肯定有一些语言功能可以完全禁用重载(使其成为非虚拟的,或者在链中的某处将其标记为
final)。似乎 OP 正在寻找不同的东西,如果类的用户重载“脆弱”方法,则会收到警告,除非他们以某种方式声明他们知道自己在做什么。
标签: c++ compiler-construction virtual-functions overriding