虚拟显式转换运算符覆盖

时间:2016-08-10 13:31:43

标签: c++ c++11 operator-overloading override explicit

我有一个课程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有一个(非explicitoperator bool,但是,如果没有override声明,则标记为virtual。这怎么可能?

1 个答案:

答案 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