I personally do not use const and non-const method overload. Since it is sometimes unclear for me which method is called. This is a simple example (much easy to understand), but there are more complicated cases.
Most of the case I want to use an overload for the const or non const method is an accessor. So, I coin method names as get_*() and peek_*(). I can get data without changing the state of the object by get_* methods, so this is a const method. But if I am peeking inside of the object and may change the state -- non const method with name peek_*().
The class B's has only const methods derived from class A, however, which still can calls non-const method in A. I think this is not intuitive for me, since a const method calls a non-const method of the internal methods when const and non-const methods are overloaded.
If I think carefully, I understand this is correct, but I need to think about it, so I do not use it. I will just change the method name, then I will be never confused and not need to think about it.
The reference case calls non-const method since a reference is virtually
a pointer. So the const-ness of the pointer is guaranteed by the
call_for_ref() const. However, it does not say the object
const-ness. Therefore, call_for_ref() const calls non-const
method.
My colleague, a language master, Ali showed me a similar example. Thanks! 2008-07-17
// Example const and non-const overload.
#include <iostream>
class ClassA
{
public:
void print() {
std::cout << "print()" << std::endl;
}
void print() const {
std::cout << "print() const" << std::endl;
}
};
class ClassB
{
public:
ClassB(ClassA & aref) : m_ref(aref){}
void call_for_ref() const { m_ref.print(); }
void call_for_obj() const { m_obj.print(); }
private:
ClassA & m_ref;
ClassA m_obj;
};
int main()
{
ClassA aobj;
ClassB bobj(aobj);
// This calls print() or print() const?
bobj.call_for_ref();
// This calls print() or print() const?
bobj.call_for_obj();
return 0;
}