C++ 是否可以识别虚拟函数的不希望的重写?
例如:C++ 是否可以识别虚拟函数的不希望的重写?,c++,compiler-construction,virtual-functions,overriding,C++,Compiler Construction,Virtual Functions,Overriding,例如: struct A { virtual void go() { }; }; struct B : public A { void go() { }; }; 函数go的隐式重写可能是不可取的,因为无法识别B::go()正在隐藏或重写structA的同一函数,甚至可能是structA中不存在的新函数override功能在需要重写虚拟函数时非常有用,但在我的情况下,这是不可取的,我不想重写函数go(),这意味着如果我知道有一个虚拟函数,我就不会在structB中重写它 我想要
struct A
{
virtual void go() { };
};
struct B : public A
{
void go() { };
};
函数go
的隐式重写可能是不可取的,因为无法识别B::go()
正在隐藏或重写structA
的同一函数,甚至可能是structA
中不存在的新函数go()
,这意味着如果我知道有一个虚拟函数,我就不会在structB
中重写它
我想要的是类似于C++11未批准的内容。C++有语言特征吗?< /P>
顺便问一下,如果虚拟函数发生隐式重写,编译器(如GCC和VC++)是否有显示警告的选项(如果错误不可用,则警告就足够了!)?如果他们有,你能为GCC提供一个例子吗
编辑:我不是在说强制或语言功能,我想要的只是一个警告或任何允许我识别不需要的覆盖的东西
编辑:什么是理想的覆盖?它可以类似于以下代码:
struct A
{
virtual void go() { };
};
struct B : public A
{
virtual void go() { };
};
或:
或者使用属性进行类似操作。我想您可以使用标记
#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()`
}
#包括
#包括
使用名称空间std;
结构无覆盖标记
{};
结构A
{
虚拟void go(){是否要禁止在所有基类中重写?如果是,请使用final
。函数隐藏不是一个错误,它是一个功能:-P@Nasser这不是Q的翻版。这里的问题是在类定义中检测重写。@ccsadegh没有答案解决它,因为在编译器实现之前,目前似乎没有办法解决它t it。如果您查看G++、Visual Studio和clang警告列表,则没有此类警告标志。@BenVoigt没错,但肯定有一些语言功能可以完全禁用重载(将其设置为非虚拟,或将其标记为链中的某个位置的final
)。OP似乎在寻找不同的东西,如果类的用户重载“易碎”方法,则会收到警告,除非他们以某种方式声明知道自己在做什么。问题是重写是不可取的,这意味着我甚至不知道是否要重写函数。@ccsadegh然后将标记添加到e签名,您将确保函数不会重写任何内容。但无论如何,您都不能强制编译器发出警告。如果使用此方法,他必须将此no_override_标记添加到每个不打算重写任何内容的方法中。@Hsi HungShih这听起来像是违背了目的,因为它听起来像OP是tr如果要检测意外重载,则类层次结构中的某些子类没有意识到父类中有一个名为go()
的方法,并重新定义它。那么“相反”可能会有所帮助:void a::go(override_tag={})
?
#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()`
}