class X
{
public:
Xoperator %( const X& ) const; //二元取余操作
XmemFunc1( const X&);
voidmemFunc2();
};
可以采用中綴或函數調用語法來調用這個重載的操作符:如下
X a,b,c;
a = b%c; //采用中綴語法調用成員操作符%
a = b.operator %(c); //成員函數調用語法
a = b.memFunc1(c); //另一個成員函數調用
然而,對重重愛操作符中的中綴調用的處理機制與此不同:
X operaator %(const X &, int); //非成員操作符聲明
//…
void X::memFunc2()
{
*this% 12; //調用非成員操作符%
operator%(*this, 12); //錯誤!實參太多
}
第一個對operator %的中綴調用,將會匹配非成員的那一個。這不是一個重載的例子,而是編譯器在兩個不同的地方查找候選函數。第二個對operator %的非中綴調用准許標准的函數查找規則,因而匹配那個成員函數,但是這裡我們會遇到一個錯誤,因為我們試圖將三個實參傳遞給一個二元函數。(記住,對成員函數的調用存在一個隱式的實參this!)
能力查詢通常是通過對不相關的類型進行dynamic_cast轉換而表達的。
Class Shape{
};
class Rollable{
};
class Square : public Shape{
};
class Wheel : public Rollable, publicRollable{
};
Shape* s = getSomeShape();
Rollable *roller = dynamic_cast
這種dynamic_cast用法通常稱為很像轉型,因為它視圖在一個類成次結果中執行橫向轉換。如果s所指對象時一個Square,那麼dynamic_cast將會失敗,從而知道s所指向的Shape不是Rollable。如果s指向的是一個Circle或從Rollable派生下來的其他Shape,那麼轉型將會成功。
在C++中,一個對象可以有多個有效的地址,因此指針比較不是地址問題,而是對象同一性問題。請看以下例子。