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、子类可以定义父类中完全相同的成员函数

posted @ 2018-06-11 14:25  老姚大大  阅读(233)  评论(0编辑  收藏  举报