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";
}