繁体   English   中英

如何使用cv-qualifier调用重载成员函数?

[英]How do I call overloaded member function with cv-qualifier?

我一直在阅读C ++标准,从那里我发现cv限定词是成员函数的函数签名的一部分。

考虑以下情况:

/******************************
* Function signature testing
*******************************/
class Signature
{   
public:
    void vSignature( void )
    {
        cout << "signature" << endl;        
    }

    void vSignature( void ) const 
    {
        cout << "constant signature" << endl;
    }
};

typedef void (Signature::*constFunc)( void ) const ;
int main(void)
{
    constFunc f = &Signature::vSignature;
    Signature s;
    s.vSignature();  //outputs 'signature'
    (s.*f)();        // outputs 'constant signature'
    return 0;
}

在上面的代码中,当我以“普通”方式调用vSignature时,将调用非常量重载。 为了“强制”使用const重载,我必须获得指向vSignature函数的指针,并将其强制转换为const重载。

除了上述方法以外,还有其他方法可以调用vSignature()const重载吗?

除了上述方法以外,还有其他方法可以调用vSignature()const重载吗?

是。 你可以这样做:

//first 
const Signature s;
s.vSignature(); //calls const function

//second
Signature s;
static_cast<const Signature &>(s).vSignature(); //calls const function

 //third
 void f(const Signature &s)
 { 
      s.vSignature(); //calls const function
 }

 Signature s;
 f(s);

这个想法是: const函数在const对象和涉及该对象的const表达式上被调用。

并不是的。 无论如何,函数的cv限定版本应与非cv限定版本完全相同 ,但出于const正确性的考虑而应存在。

据我了解,const成员函数仅在const对象上调用,因此,如果您的对象是非const,它将调用非const函数。

如果调用该函数的对象是const则将调用所需的函数:

((const Signature&)s).vSignature();

选择的重载取决于表达式的类型,而不是对象的基础类型。 因此,您可以只在const后面加上强制类型转换:

const_cast<Signature const&>(s).vSignature();

这具有额外的优势,即读者可以轻松发现您正在做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM