首先,重寫是指派生類的方法覆蓋基類的方法,要求方法名、方法的引數都相同。重寫是c++中實現多型這個特性基礎。重寫又稱為覆蓋,是指派生類函式覆蓋基類函式,與重定義不同,重寫要求被重寫的基類函式為虛函式。
例如下面的**:
class base;
class derived :public base
};class child :public derived
};
總結一下,重寫是指派生類重新定義了基類的虛函式,基類函式必須有virtual關鍵字修飾,不能有static關鍵字;返回值型別必須是相同的,或者是協變的;此外重寫函式的訪問修飾符可以不同。
注意:一般重寫要求函式具有完全相同的入參,否則就會提示錯誤,而這個規則對於協變而言則有所放鬆。覆蓋的返回值不區分基類或者派生類,如下**:
class base
};class derived :public base
};//協變
class father;
class child
};
在上面協變的例子中,要求base和derived兩個類必須在使用前被完整的定義。
協變返回型別的優勢在於,若是我們使用father,就能獲得乙個抽象的base,如果我們正在處理child,就會獲得乙個derived。協變的返回機制將我們從這樣一種處境中解脫出來:不得不使用易於出錯的轉換操作來「重新」提供型別資訊,而這種資訊是一開始就不應該丟掉的。
然後是過載(overload),過載是應用於相同作用域之內的同名函式,由於引數列表不同而產生的不同的實現方法。此處提到的作用域有:全域性作用域、區域性作用域以及類作用域,當在同乙個作用域內的時候同名的函式或者稱之為方法,由於引數列表的不同,而獲得的不同的函式。
int sum(int a, int b);
int sum(int a, int b, int c);
int sum(float a, float b);
過載是一種語言特性,是一種語法規則,與多型無關,與物件導向無關。
重定義則是經常出現在基類和派生類之間,歸結起來有如下的特點:
1)不在同乙個作用域,主要是指類作用域,分別位於基類和派生類之中;
2)函式名稱相同,但是返回值可以不同;
3)引數不同時,無論有沒有virtual關鍵字,基類的函式都會被隱藏;引數相同時,但是基類函式沒有關鍵字virtual,此時基類函式被隱藏。
例如:
class base
void print()
int sum(int a, int b);
private:
//};class derived :public base
void print()
int sum(int a, int b, int c);
};
在執行derived的例項的時候可以很容易的發現,基類中sum函式被隱藏了。因此重定義又稱為隱藏,是指派生類的函式遮蔽了與其同名的基類函式。
int _tmain(int argc, _tchar* argv)
例如上面的類,我們在如上呼叫的時候得到了下面的輸出:
重寫 過載和重定義的區別
首先,重寫是指派生類的方法覆蓋基類的方法,要求方法名 方法的引數都相同。重寫是c 中實現多型這個特性基礎。重寫又稱為覆蓋,是指派生類函式覆蓋基類函式,與重定義不同,重寫要求被重寫的基類函式為虛函式。例如下面的 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1...
重寫 過載和重定義
函式過載 1 必須在乙個類中 2 子類無法過載父類的函式,父類同名的函式將被名稱覆蓋 不管引數相不相同 3 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 1 必須發生於父類和子類之間 2 父類和子類之間必須有相同的函式原型 3 使用virtual關鍵字之後可以產生多型 如果不使用virt...
過載 重寫 重定義區別
過載 函式名相同,函式的引數個數 引數型別或引數順序三者中必須至少有一種不同。函式返回值的型別可以相同,也可以不相同。發生在乙個類內部。重定義 也叫做隱藏,子類重新定義父類中有相同名稱的非虛函式 引數列表可以不同 指派生類的函式遮蔽了與其同名的基類函式。可以理解成發生在繼承中的過載。重寫 也叫做覆蓋...