Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以识别虚拟函数的不希望的重写?_C++_Compiler Construction_Virtual Functions_Overriding - Fatal编程技术网

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()
正在隐藏或重写struct
A
的同一函数,甚至可能是struct
A
中不存在的新函数override功能在需要重写虚拟函数时非常有用,但在我的情况下,这是不可取的,我不想重写函数
go()
,这意味着如果我知道有一个虚拟函数,我就不会
在struct
B
中重写它

我想要的是类似于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()`


}