我有一个课程Base
,用于定义explicit operator bool
:
struct Base {
virtual explicit operator bool() const {
return true;
}
};
我有一个子类Derived
,定义了operator bool
:
struct Derived : Base {
operator bool() const override {
return false;
}
};
正如您所看到的,Derived::operator bool
明确没有标记为explicit
,但标记为override
,所以我希望编译器会抱怨。然而,gcc和clang似乎都同意这是有效的。我的期望是不合理的吗?
此外,如果我按如下方式使用这些类,TakesBool(base)
不会编译(如预期的那样),但TakesBool(derived)
会这样做:
void TakesBool(bool b) {}
int main() {
//Base base; TakesBool(base); // compilation error (as expected)
Derived derived; TakesBool(derived);
return 0;
}
这似乎表明Derived
有一个(非explicit
)operator bool
,但是,如果没有override
声明,则标记为virtual
。这怎么可能?
答案 0 :(得分:18)
您可能认为explicit
中的非operator bool
Derived
并未覆盖explicit
中的operator bool
Base
, ,确实。 explicit specifier并不重要,它不是功能签名的一部分。
从标准§10.3/2 Virtual functions [class.virtual]:
开始(强调我的)
如果在类
vf
和类Base
中声明虚拟成员函数Derived
,直接或间接地从Base
派生,则成员函数{{1声明了同名,参数类型列表([dcl.fct]),cv-qualification和ref-qualifier(或不存在相同),vf
,然后Base::vf
也是虚拟的(无论是否如此声明)并覆盖Derived::vf
。
因此,只有当函数的name,parameter-list,cv-qualification或ref-qualifier不匹配时,编译器才会抱怨,不会考虑显式说明符。
你说"标记Base::vf
没有override
声明",请注意派生类中成员函数的virtual
声明是多余的,它&# 39; s也是virtual
。