虚拟显式转换运算符覆盖

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 有一个(非 explicitoperator 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.