我创建了一个有两个get方法的类,一个是const和一个非const. const方法是公共的,所以用户可以查询向量.非const方法受到保护,所以我可以使用它来修改我需要的数据.
当我尝试使用类,并调用get方法时,编译器会抱怨非const方法被保护.相反,我必须使用const_cast将对象转换为const,所以我可以改为public方法.
有办法解决这个问题吗?为什么编译器本身不会执行,因为有一个公共方法?如果我删除受保护的版本,只是离开const一个,它工作正常,所以它在这种情况下做演员. Cast到const总是安全的.它是删除常量,这是一个问题.
解决方法
编译器在决定要调用什么成员函数之后考虑可访问性.也就是说,保护和私有功能仍然可见,即使它们不可访问.
为什么?一个原因是,如果您通过重载分辨率忽略了无法访问的功能,则可以通过更改其可访问性来更改所谓的功能.使用当前规则,您只能导致编译代码无法编译,或导致当前无法编译的代码,或更改不影响代码含义的内容.您不能更改访问说明符并静默导致调用不同的函数.
作为一个例子,这是一个非常可怕的类接口:
public: // Returns the amount of change tendered for this transaction. MoneyAmount change() const; private: // Account for a change of currency. Charges standard moneychanger's fee. MoneyAmount change(Currency toCurrency = Currency::USD);
如果无法访问的功能从重载分辨率中删除,客户端代码可以调用change()就可以了.如果稍后第二个变更(货币)功能被公开,第一个更改(Currency)功能被删除,那么该代码将突然默认地调用另一个功能完全不同的功能.当前的规则阻止访问说明符更改编译程序的行为.