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

Mih*_*los 2 c++ tinyxml

我正在使用TinyXML2开展一个项目.我正在尝试调用方法XMLAttribute*FindAttribute(const char*name)

该方法由实现定义为:

public : 
const XMLAttribute* FindAttribute( const char* name ) const;

private :
XMLAttribute* FindAttribute( const char* name );
Run Code Online (Sandbox Code Playgroud)

关于方法如何在公共和私有范围内具有相同的签名,我有点困惑.我只能猜测它没有,虽然我并不真正理解公共定义末尾的const部分.但是,我需要调用public方法,但g ++ sais" tinyxml2 :: XMLElement :: FindAttribute(const char*)是私有的 "

如何调用公共方法,方法原型末尾的const部分是什么?

Ele*_*rks 5

函数可以根据其自身的重载而过载const.这是C++的一个重要特性.

// const member function:
const XMLAttribute* FindAttribute( const char* name ) const;

// non-const member function
XMLAttribute* FindAttribute( const char* name );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,const使函数不同的是const以下括号.在const而之前的括号不属于该方法的签名const后面的括号一样.后一种用法const指定可以从const对象调用哪些成员函数,哪些不可以.换句话说,它指定const对象的合同.

如果您有一个const对象,const则会调用该方法:

const MyObject cObj;
cObj.FindAttribute("cats");
// const method will be called
Run Code Online (Sandbox Code Playgroud)

如果您有非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
Run Code Online (Sandbox Code Playgroud)