【发布时间】:2014-04-06 14:02:23
【问题描述】:
C++11 引入了非常有用的说明符 override 用于显式覆盖一个基本虚函数。但是显式隐藏呢?
例如,考虑代码:
struct A: B {
void f();
}
- 如果存在虚拟
void B::f(),代码会导致隐式覆盖此函数。 - 如果存在非虚拟的
void B::f(),代码会导致隐藏此功能。
即代码的含义取决于void B::f()的存在性和虚拟性。
问题。如何显式隐藏基函数?如果我尝试隐藏虚拟功能,我想得到错误。
如override是守卫,以保证有虚基函数具有相同的原型,我需要一个守卫来确保没有具有相同原型的虚拟基函数。
史诗般的失败示例:
#include <stdio.h>
struct B {
void f() {printf("Hello\n");}
void g() {f();}
};
struct A: B {
void f() {g();}
};
int main() {
A a;
a.f();
return 0;
}
程序打印“你好”。但是如果我将B::f() 设为虚拟程序会导致分段错误(无限递归)。如果B 类是第三方的并且我只是#include 它,这可能是一个真正的问题,那就是更改第三方代码中的虚拟性可能会导致我的代码出现错误。
UPD。我通过 new 说明符找到了 C# have this feature。似乎 C++ 还没有(还没有?)。
【问题讨论】:
-
因为如果
B::f()是虚拟的并且A::f覆盖它,那么A::f调用g::f,它调用A::f,它调用g::f,它调用A::f.. 也就是无限递归。 . 它不调用B::f。 -
您可能符合条件:
void g() { B::f(); } -
@DieterLücking:我已经更新了我的帖子。基类的代码并不总是可以控制的。
-
@Corvus 那么,你必须打破这个圈子——意思是——你不能打电话给
B::g() -
@DieterLücking:
B::g()是任意基函数。我什至不知道它叫f()。你建议我根本不要调用基本函数吗?..
标签: c++