C++基础-6-继承

6. 继承

 1 #include<iostream>
 2 using namespace std;
 3 
 4 
 5 class Base {
 6 public:
 7     Base() {
 8         m_A = 10;
 9     }
10     int m_A;
11 
12 };
13 
14 class Son: public Base {
15 public:
16     Son() {
17         m_A = 20;
18     }
19     int m_A;
20 };
21 
22 // 对于静态成员
23 class Base1 {
24 public:
25 
26     static int m_A;
27 
28 };
29 
30 int Base1::m_A = 10;
31 
32 class Son1 : public Base1 {
33 public:
34 
35     static int m_A;
36 };
37 int Son1::m_A = 20;
38 
39 void test01() {
40     // 1.通过对象访问
41     Base b1;
42     Son s1;
43     cout << "通过对象访问" << endl;
44     cout << "Base --->  m_A:" << b1.m_A << endl;
45     cout << "Son  --->  m_A:" << s1.Son::m_A << endl;
46 
47 
48     // 2.通过类名访问(对于静态成员)
49     cout << "通过类名访问" << endl;
50     cout << "Base1 --->  m_A:" << Base1::m_A << endl;
51     cout << "Son1  --->  m_A:" << Son1::Base1::m_A << endl;
52 }
53 
54 int main() {
55 
56     test01();
57 
58     system("pause");
59 
60     return 0;
61 }
62 
63 // 总结(继承)
64 // 继承---目的是减少重复代码,提高代码的复用率
65 // 
66 // 继承语法:class 子类: 继承方式 父类
67 // 继承方式:公共继承(public),保护继承(protected),私有继承(private)
68 // 
69 // 父类中所有的非静态成员属性都会被子类继承下去
70 // 父类中私有成员属性 是被编译器隐藏了,因此访问不到,但是会被继承下去
71 // 
72 //    cl /d1 reportSingleClassLayout(xxx类名) xxx.cpp
73 //    第一个是L,第二个是123的1,报告单各类的布局
74 // 
75 // 继承中构造和析构的顺序:
76 //        先构造 父类,再构造 子类; 析构顺序与构造顺序相反;
77 // 
78 // 继承同名成员(变量/函数)的处理方式:
79 //        当子类与父类出现同名成员,
80 //            访问子类同名成员 直接访问即可  s.m_A
81 //            访问父类同名成员 需要加作用域  s.Base::m_A
82 // 
83 //        此外,对于静态成员,处理方式与非静态成员相同
84 // 
85 // 菱形继承
86 //        两个派生类继承同一个基类
87 //        又有某个类同时继承两个派生类
88 //        这样的继承成为菱形继承,或者钻石继承
89 //        
90 //        存在问题:
91 //            产生二义性(加作用域解决)
92 //            重复继承,只需要一份继承即可
93 //            利用虚继承解决,关键字virtual
94 // 

参考:《黑马程序员》C++教程

Tags: