[英]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.