Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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 Errors_Overriding_Compiler Warnings - Fatal编程技术网

C++ 如何确定函数是否在编译时被重写?

C++ 如何确定函数是否在编译时被重写?,c++,compiler-errors,overriding,compiler-warnings,C++,Compiler Errors,Overriding,Compiler Warnings,也许是个愚蠢的问题 假设我有以下几点: class A{ int x; int y; virtual int get_thing(){return x;} }; class B : public A { int get_think(){return y;} }; 在上面的示例中,B::get_thing返回x,因为覆盖代码有一个输入错误 如何确保在编译时get_thing函数在类B中被重写,从而返回y 假设A::get_thing是虚拟的,假设类B派生

也许是个愚蠢的问题

假设我有以下几点:

class A{
     int x;
     int y;
     virtual int get_thing(){return x;}
};

class B : public A {
     int get_think(){return y;}
};
在上面的示例中,B::get_thing返回x,因为覆盖代码有一个输入错误


如何确保在编译时get_thing函数在类B中被重写,从而返回y

假设
A::get_thing
是虚拟的,假设
类B
派生自
类A
,并且您有C++11支持,您可以使用:


这将产生一个编译器错误。请注意,这是基于方法的签名,即其名称、cv限定符和参数类型。返回类型或函数体不在其中。

假设
A::get_thing
是虚拟的,假设
类B
派生自
类A
,并且您有C++11支持,您可以使用:


这将产生一个编译器错误。请注意,这是基于方法的签名,即其名称、cv限定符和参数类型。返回类型或函数体不在其中。

首先,您的示例中有一个错误,我认为
B
应该是
a
的子函数,不是吗

但答案是:您可以比较函数的地址(当然,如果您需要它,并且无法在编程时检查它):

if(reinterpret\u cast(&B::get\u think)!=reinterpret\u cast(&A::get\u think)){

std::cout首先,您的示例中有一个错误,我认为
B
应该是
a
的孩子,不是吗

但答案是:您可以比较函数的地址(当然,如果您需要它,并且无法在编程时检查它):

if(reinterpret\u cast(&B::get\u think)!=reinterpret\u cast(&A::get\u think)){


std::cout在这种情况下,它非常简单:非虚拟函数永远不会被重写。@DavidRodríguez Dribea是对的,示例中的输入错误。我的意思是,我没有制作纯虚拟函数是有原因的。你真正想要的是什么?强制
B
的实现者重写函数?确保的签名e> get_thing
与基类中的虚拟函数相同吗?不,我希望能够向编译器表明,我打算用在派生类中编写的内容重写基类函数,并让它在所讨论的函数未重写基类函数时发出警告。出于兴趣,您为什么不希望使用纯虚拟来实现这一点?我知道它可能会有其他副作用,但这似乎是解决您问题的一个显而易见的解决方案。在这种情况下,它非常简单:非虚拟函数永远不会被重写。@DavidRodríguez Dribea是对的,示例中的拼写错误。我的意思是,我没有制作纯虚拟是有原因的。什么您真的想要吗?强制
B
的实现者重写函数?确保
get\u thing
的签名与基中的虚拟函数相同?不,我希望能够向编译器表明,我打算用我在派生c中编写的东西重写基类函数如果所讨论的函数未重写基类函数,请让它警告我。出于兴趣,您为什么不想使用纯虚拟来实现这一点?我知道它可能会有其他副作用,但这似乎是解决您问题的一个非常明显的解决方案。啊!这正是我想要的。谢谢您的理解尽管出现了错误,我的示例代码还是失败了。
override
non关键字只会确保签名与基中的虚拟函数的签名相匹配,但它不会确保
get\u thing
在类B中被重写,更不用说返回yWas,因为在C++11之前有这样的方法吗?@johnducette在C++11之前,我不知道有什么干净的、非侵入式的方法可以做到这一点。自VS2005()以来,Microsoft的编译器一直支持override关键字.Ah!这正是我要寻找的。感谢您在我的示例代码中发现了错误!非关键字
override
只能确保签名与基中的虚拟函数的签名匹配,但它不能确保
get_thing
已在类B中被重写,更不用说它返回了在C++11之前有没有这样的方法?@johnducette我不知道在C++11之前有什么干净的、非侵入性的方法可以做到这一点。微软的编译器从VS2005开始就支持override关键字()。你不能像那样将PMF转换为void*,这肯定不是编译器错误。你不能像那样将PMF转换为void*,这肯定不是编译器错误。
class B : public A{
     int get_think() override {return y;}
};
if( reinterpret_cast<void*>(&B::get_think) != reinterpret_cast<void*>(&A::get_think) ) {
    std::cout << "B override A";
} else {
    std::cout << "B override A";
}