思考:
子類中是否能夠定義父類中的同名成員?若是能夠,如何區分?若是不能夠,爲何?ios
#include <iostrem> using namespace std; class Parent { public: int mi; }; class Child : public Parent { public: int mi; }; int main() { Child c; c.mi = 100; // mi 到底是子類定義的,仍是從父類繼承獲得的? return 0; }
輸出: 無錯誤,無警告
- 子類能夠定義父類中的同名成員【位於不一樣做用域中】
- 子類中的成員將隱藏父類中的同名成員
- 父類中的同名成員依然存在於子類中
- 經過做用域分邊符(::)訪問父類中的同名成員
- 訪問父類中的同名成員
void code() { Child c; c.mi = 100; // 子類中的 mi c.Parent::mi = 1000; // 父類中的 mi }
#include <iostream> using namespace std; namespace A { int g_i = 0; }; namespace B { int g_i = 1; }; class Parent { public: int mi; Parent() { cout << "Parent()" << "&mi = " << &mi << endl; } }; class Child : public Parent { public: int mi; Child() { cout << "Child()" << "&mi = " << &mi << endl; } }; int main() { Child c; c.mi = 100; c.Parent::mi = 1000; cout << "&c.mi = " << &c.mi << endl; cout << "c.mi = " << c.mi << endl; cout << "&c.Parent::mi = " << &c.Parent::mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; return 0; }
輸出: Parent() : &mi = 0xbf9797a8 ; 注意這裏 A Child() : &mi = 0xbf9797ac ; 注意這裏 B &c.mi = 0xbf9797ac ; 注意這裏 B c.mi = 100 &c.Parent::mi = 0xbf9797a8 ; 注意這裏 A c.Parent::mi = 1000
類中的成員函數能夠進行重載編程
- 重載函數的本質爲多個不一樣函數
- 函數名和參數列表是惟一的標識
- 函數重載必須發生在同一個做用域中
問題:
子類中定義的函數是否可以重載父類中的同名函數?函數
#include <iostream> using namespace std; class Parent { public: int mi; void add(int v) { mi += v; } void add(int a, int b) { mi += (a + b); } }; class Child : public Parent { public: int mi; void add(int x, int y, int z) { mi += (x + y + z); } }; int main() { Child c; c.mi = 100; c.Parent::mi = 1000; cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; c.add(1); // Error c.add(2, 3); // Error c.add(4, 5, 6); cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; return 0; }
輸出: test.cpp: In function ‘int main()’: test.cpp:41: error: no matching function for call to ‘Child::add(int)’ test.cpp:25: note: candidates are: void Child::add(int, int, int) test.cpp:42: error: no matching function for call to ‘Child::add(int, int)’ test.cpp:25: note: candidates are: void Child::add(int, int, int) 結論: 子類沒法重載父類中的成員函數
- 子類中的函數將隱藏父類的同名函數
- 子類沒法重載父類中的成員函數(不一樣做用域)
- 使用做用域分辨符訪問父類中的同名函數
- 子類能夠定義父類中徹底相同的成員函數
#include <iostream> using namespace std; class Parent { public: int mi; void add(int v) { mi += v; } void add(int a, int b) { mi += (a + b); } }; class Child : public Parent { public: int mi; void add(int a, int b) { mi += (a + b); } void add(int x, int y, int z) { mi += (x + y + z); } }; int main() { Child c; c.mi = 100; c.Parent::mi = 1000; cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; c.Parent::add(1); c.add(2, 3); c.add(4, 5, 6); cout << "c.mi = " << c.mi << endl; cout << "c.Parent::mi = " << c.Parent::mi << endl; return 0; }
輸出: c.mi = 100 c.Parent::mi = 1000 c.mi = 120 c.Parent::mi = 1001 注意:【做用域】 c.Parent::add(1); 累加到 c.Parent::mi; c.add(2, 3); c.add(4, 5, 6); 累加到 c.mi;
- 子類能夠定義父類中的同名成員
- 子類中的成員將隱藏父類中的同名成員
- 子類和父類中的函數不能構成重載關係【不一樣做用域】
- 子類能夠定義父類中徹底相同的成員函數
- 使用做用域分辨符訪問父類中的同名成員
以上內容參考狄泰軟件學院系列課程,請你們保護原創!spa