C ++调用具有相同签名但范围不同的方法

时间:2014-07-10 06:53:26

标签: c++ tinyxml

我正在使用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部分是什么?

2 个答案:

答案 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对包含类的访问。这取决于函数签名的唯一性。