47-父子间的冲突
【问题】子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么?
【范例代码】同名成员变量
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Parent { 7 public: 8 int mi; 9 }; 10 11 class Child : public Parent { 12 public: 13 int mi; 14 }; 15 16 int main(int argc, const char* argv[]) { 17 Child c; 18 19 c.mi = 100; // mi 究竟是子类自定义的,还是从父类继承得到的? 20 21 return 0; 22 }
父子间的冲突
1、子类可以定义父类中的同名成员
2、子类中的成员将隐藏父类中的同名成员
3、父类中的同名成员依然存在于子类中
4、通过作用域分辨符(::)访问父类中的同名成员
访问父类中的同名成员:
Child c; c.mi = 100; // 子类中的mi c.Parent::mi = 1000; // 父类的mi
【范例代码】同名成员变量深度分析
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 namespace A { 7 int g_i = 0; 8 } 9 10 namespace B { 11 int g_i = 1; 12 } 13 14 class Parent { 15 public: 16 int mi; 17 18 Parent() { 19 cout << "Parent() : " << "&mi = " << &mi << endl; 20 } 21 }; 22 23 class Child : public Parent { 24 public: 25 int mi; 26 27 Child() { 28 cout << "Child() : " << "&mi = " << &mi << endl; 29 } 30 }; 31 32 int main(int argc, const char* argv[]) { 33 Child c; 34 35 c.mi = 100; 36 37 c.Parent::mi = 1000; 38 39 cout << "&c.mi = " << &c.mi << endl; 40 cout << "c.mi = " << c.mi << endl; 41 42 cout << "&c.Parent::mi = " << &c.Parent::mi << endl; 43 cout << "c.Parent::mi = " << c.Parent::mi << endl; 44 45 return 0; 46 }
再论重载
类中的成员函数可以进行重载:
1、重载函数的本质为多个不同的函数
2、函数名和参数列表是唯一的标识
3、函数重载必须发生在同一个作用域中
【问题】子类中定义的函数是否能重载父类中的同名函数?
【范例代码】父子间的函数重载
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Parent { 7 public: 8 int mi; 9 10 void add(int v) { 11 mi += v; 12 } 13 14 void add(int a, int b) { 15 mi += (a + b); 16 } 17 }; 18 19 class Child : public Parent { 20 public: 21 int mi; 22 23 void add(int v) { 24 mi += v; 25 } 26 27 void add(int a, int b) { 28 mi += (a + b); 29 } 30 31 void add(int x, int y, int z) { 32 mi += (x + y + z); 33 } 34 }; 35 36 int main(int argc, const char* argv[]) { 37 Child c; 38 39 c.mi = 100; 40 41 c.Parent::mi = 1000; 42 43 cout << "c.mi = " << c.mi << endl; 44 45 cout << "c.Parent::mi = " << c.Parent::mi << endl; 46 47 c.add(1); 48 c.add(2, 3); 49 c.add(4, 5, 6); 50 51 cout << "c.mi = " << c.mi << endl; 52 53 cout << "c.Parent::mi = " << c.Parent::mi << endl; 54 55 return 0;
函数覆盖
1、子类中的函数将隐藏父类的同名函数
2、子类无法重载父类中的成员函数
3、使用作用域分辨符访问父类中的同名函数
4、子类可以定义父类中完全相同的成员函数