我正在使用TinyXML2开展项目。我正在尝试调用方法 XMLAttribute * FindAttribute(const char * name)
此方法由实现定义为:
public :
const XMLAttribute* FindAttribute( const char* name ) const;
private :
XMLAttribute* FindAttribute( const char* name );
关于方法如何在公共和私有范围内具有相同的签名,我有点困惑。我只能猜测它没有,虽然我并不真正理解公共定义末尾的const部分。但是,我需要调用public方法,但g ++ sais“ tinyxml2 :: XMLElement :: FindAttribute(const char *)是私有的”
如何调用public方法,方法原型结尾的const部分是什么?
答案 0 :(得分:5)
根据const
单独的功能,可以重载功能。这是C ++的一个重要特性。
// const member function:
const XMLAttribute* FindAttribute( const char* name ) const;
// non-const member function
XMLAttribute* FindAttribute( const char* name );
在这种情况下,使函数不同的const
是括号后面的const
。括号前的const
不属于方法签名,而括号后面的const
也属于方法签名。后一种const
的使用指定了可以从const
个对象调用哪些成员函数,哪些不可以。换句话说,它指定了const
个对象的合同。
如果您有const
个对象,则会调用const
方法:
const MyObject cObj;
cObj.FindAttribute("cats");
// const method will be called
如果您有一个非const
对象,编译器将查找非const
方法并调用它。如果它不存在,它将查找const
方法并调用它。编译器以这种方式工作,因为从非const
对象调用const
成员函数是合法的,但从const
个对象调用非const
成员函数是非法的
MyObject obj;
obj.FindAttribute("cats");
// non-const method will be called
// if it does not exist the compiler will look for a const version
答案 1 :(得分:3)
关于方法如何在公共和私有范围内具有相同的签名,我有点困惑。
他们实际上并没有相同的签名
const XMLAttribute* FindAttribute( const char* name ) const;
// ^^^^^^
公共方法适用于const
对包含类的访问。这取决于函数签名的唯一性。