C++的重載給人留下了很是深入的影響,緣由是重載的條件很值得注意:函數名相同,參數列表不相同的兩個函數構成重載函數,而無關乎兩者的返回值。ios
可是C++中的函數重寫又是另外一碼事。標準規定:只要函數名相同,就會被重寫。重寫以後用子類訪問「本該被繼承的」父類的函數,將會調用子類的同名函數,而與父類中有什麼樣的同名函數無關(也就是當它不存在)。例如:函數
#include <iostream> using namespace std; class A { public: int func() { return 1; } }; class B: public A { public: char func(int a) { return '2'; } }; main() { B b; cout <<b.func()<<endl; cout <<b.func(1)<<endl; }
上面這段代碼中,main函數中的b.func(1)將成功被調用,而b.func()將報錯:spa
Untitled1.cpp|25|error: no matching function for call to 'B::func()'|
由於此時從父類那裏集成而來的int func()已然被重寫,即便參數列表不一樣,即便返回值也不一樣。int func()在子類B中早已不復存在了。code