虚拟显式转换运算符覆盖
Virtual explicit conversion operator overriding
我有一个 class Base
定义一个 explicit operator bool
:
struct Base {
virtual explicit operator bool() const {
return true;
}
};
我有一个子class Derived
,定义一个operator bool
:
struct Derived : Base {
operator bool() const override {
return false;
}
};
如您所见,Derived::operator bool
明确未标记为 explicit
,而是标记为 override
,因此我预计编译器会抱怨。然而,gcc 和 clang 似乎都同意这是有效的。我的期望不合理吗?
此外,如果我按如下方式使用 classes,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
宣言。这怎么可能?
你可能认为 Derived
中的非 explicit
operator bool
不会覆盖 Base
中的 explicit
operator bool
,不,它 确实 。 explicit specifier 无关紧要,它不是函数签名的一部分。
根据标准,§10.3/2 虚拟函数
[class.virtual]:
(强调我的)
If a virtual member function vf
is declared in a class Base
and in a class Derived
, derived directly or indirectly from Base
, a member function vf
with the same name, parameter-type-list ([dcl.fct]), cv-qualification, and ref-qualifier (or absence of same) as Base::vf
is declared, then Derived::vf
is also virtual (whether or not it is so declared) and it overrides Base::vf
.
因此只有当函数的名称、参数类型列表、cv 限定符或 ref 限定符不匹配时,编译器才会报错,不会考虑显式说明符。
你说"marked override
without a virtual
declaration",注意派生class中成员函数的virtual
声明是多余的,也是virtual
.
我有一个 class Base
定义一个 explicit operator bool
:
struct Base {
virtual explicit operator bool() const {
return true;
}
};
我有一个子class Derived
,定义一个operator bool
:
struct Derived : Base {
operator bool() const override {
return false;
}
};
如您所见,Derived::operator bool
明确未标记为 explicit
,而是标记为 override
,因此我预计编译器会抱怨。然而,gcc 和 clang 似乎都同意这是有效的。我的期望不合理吗?
此外,如果我按如下方式使用 classes,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
宣言。这怎么可能?
你可能认为 Derived
中的非 explicit
operator bool
不会覆盖 Base
中的 explicit
operator bool
,不,它 确实 。 explicit specifier 无关紧要,它不是函数签名的一部分。
根据标准,§10.3/2 虚拟函数 [class.virtual]:
(强调我的)
If a virtual member function
vf
is declared in a classBase
and in a classDerived
, derived directly or indirectly fromBase
, a member functionvf
with the same name, parameter-type-list ([dcl.fct]), cv-qualification, and ref-qualifier (or absence of same) asBase::vf
is declared, thenDerived::vf
is also virtual (whether or not it is so declared) and it overridesBase::vf
.
因此只有当函数的名称、参数类型列表、cv 限定符或 ref 限定符不匹配时,编译器才会报错,不会考虑显式说明符。
你说"marked override
without a virtual
declaration",注意派生class中成员函数的virtual
声明是多余的,也是virtual
.