What I don't understand is: the second "const", that is using before every Check's body function like: bool Check(const Shape& s)const{return s.Check(*this);}.
I can not find something similar to this in my ebooks.
So I need your helps.
Thanks in advanced!

The trailing const on a non-static member function means that the abstract (logical, externally visible) state of the object pointed to by this will not be changed by this member function. Where possible, the compiler enforces this rule. However, the const specifier does not promise that the physical state ("raw bits") of the object will never change.

struct mystring
{
private:
int len ; // number of chars in the mystring; part of it's logical state
char* p ; // points to the (first char of) the actual chars of the mystring
// every char in this buffer forms part of the logical state
// if we allocate a new buffer, copy the contents of the current buffer
// into the new buffer, and then modify p to point to the new buffer,
// the logical state of mystring does not change
public:
// ... mystring member functions
// *** compile-time error - attempt to change the const object *this
void foo() const { ++len ; }
// fine by the compiler - no attempt to change the member p
// see: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.15
// *** but it is a logical error - changes the logical state of a const object
void bar() const { if(len>0) p[0] = 'a' ; }
// fine - it is ok to change a different (non-const) object
void baz() const { mystring another ; ++another.len ; /* ... */ }
// fine - mutable members are never const;
// they do not contribute to the logical state of the object
void foobar() const { ++num_foobar_calls ; /* ... */ }
private: mutable int num_foobar_calls ; // not part of logical state
};

The trailing const on a non-static member function means that the abstract (logical, externally visible) state of the object pointed to by this will not be changed by this member function. Where possible, the compiler enforces this rule. However, the const specifier does not promise that the physical state ("raw bits") of the object will never change.

Whew! All that gobbledegook to just say what I did in my previous post. Sounds like it came straight out of a text book :)

look at the parameters for Shape::Check -- do they contain const keyword? t is const in intersect() so it can't be passed to a function whose parameter is not const. And yes, getting all those const straight is a pain in the behind :)