-
被忽视的细节
冒号(:)表示继承关系,Parent表示被继承的类,public的意义是什么? class Parent { }; class Child :public Parent { };
-
有趣的问题:是否可以将继承中的public换成protected或者private?如果可以,与public继承有什么区别?
-
答:可以!!
-
C++中支持三种不同的继承方式
public继承: 父类成员在子类中保持原有访问级别
private继承: 父类成员在子类中变为私有成员
protected继承 :父类中的公有成员变为保护成员,其它保持不变
继承方式/父类成员访问级别
|
public | protected | private |
public | public | protected | private |
protected | protected | protected | private |
private | private | private | private |
-
C++中的默认继承方式为private!
-
事实
-
一般而言,C++工程项目只使用public继承
-
C++的派生语言只支持一种继承方式(public继承)
-
protected和private继承带来的复杂性远大于实用性
-
实验
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class Parent 5 { 6 protected: 7 int m_a; 8 protected: 9 int m_b; 10 public: 11 int m_c; 12 void set(int a, int b, int c) 13 { 14 m_a = a; 15 m_b = b; 16 m_c = c; 17 } 18 }; 19 class Child_A : public Parent 20 { 21 public: 22 void print() 23 { 24 cout << "m_a" << m_a << endl; 25 cout << "m_b" << m_b << endl; 26 cout << "m_c" << m_c << endl; 27 } 28 }; 29 class Child_B : protected Parent 30 { 31 public: 32 void print() 33 { 34 cout << "m_a" << m_a << endl; 35 cout << "m_b" << m_b << endl; 36 cout << "m_c" << m_c << endl; 37 } 38 }; 39 class Child_C : private Parent 40 { 41 public: 42 void print() 43 { 44 cout << "m_a" << m_a << endl; 45 cout << "m_b" << m_b << endl; 46 cout << "m_c" << m_c << endl; 47 } 48 }; 49 int main() 50 { 51 Child_A a; 52 Child_B b; 53 Child_C c; 54 a.m_c = 100; 55 // b.m_c = 100; // Child_B 保护继承自 Parent, 所以所有的 public 成员全部变成了 protected 成员, 因此外界无法访问 56 // c.m_c = 100; // Child_C 私有继承自 Parent, 所以所有的成员全部变成了 private 成员, 因此外界无法访问 57 a.set(1, 1, 1); 58 // b.set(2, 2, 2); 59 // c.set(3, 3, 3); 60 a.print(); 61 b.print(); 62 c.print(); 63 return 0; 64 }
-
运行结果
m_a1
m_b1
m_c1
m_a-858993460
m_b-858993460
m_c-858993460
m_a-858993460
m_b-858993460
m_c-858993460
-
小结:
-
C++中支持三种不同的继承方式
-
继承属性直接影响父类成员在子类中的访问属性
-
一般而言,工程中只使用public的继承方式
-
C++的派生语言只支持public继承方式