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

时间:2011-04-11 10:35:15

标签: c++

我一直在阅读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重载。为了“强制”使用const重载,我必须获得指向vSignature函数的指针并将其转换为const重载。

除了上面的内容之外还有其他方法可以调用vSignature()const重载吗?

5 个答案:

答案 0 :(得分:4)

  

除了上面的内容之外还有其他方法可以调用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表达式涉及对象。

答案 1 :(得分:1)

不是真的。在任何情况下,函数的cv限定版本应该与非cv限定版本执行完全相同的事物,但是为了const正确性应该只是在那里。

答案 2 :(得分:0)

据我所知,const成员函数只在const对象上调用,所以如果你的对象是非const,它将调用非const函数。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

选择的重载取决于表达式的类型,而不是对象的基础类型。因此,您只需使用强制转换添加const:

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

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