例如:
struct A
{
virtual void go() { };
};
struct B : public A
{
void go() { };
};
函数的implicriqu topriond可能是不可取的,因为go
B::go()
隐藏或覆盖了struct
A
的相同函数,甚至可能是在struct
A
override
中不存在的新函数,这是无法识别的。 。
go()
当您想要理想的虚拟函数覆盖时,C ++ 11的功能很有用,但是就我而言,它是不受欢迎的,我不想覆盖函数,这意味着,如果我知道有一个虚拟的功能函数i不会在struct
override
.中它
我想要的是类似于[[check_names]]属性提案不批准C ++ 11的东西。 C ++是否具有语言功能?
通过方式,编译器(例如GCC和VC ++)是否可以选择警告(如果不可用的话,警告就足够了!),如果发生虚拟函数的隐式压倒式?如果有的话,您可以提供GCC的示例吗? eDit
:我不是在谈论力量或语言功能,我想要的只是一个警告或任何使我能够识别不受欢迎的压倒的东西。 eDit:可以选择?它可以是以下代码:
B
或:
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()
中声明什么。不是超级优雅,但它可以奏效,但是我不知道你为什么真的想这样做。