派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的。类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下三种访问说明符中的一个:public,private,protectedd。
c++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数(virtual)。当我们使用指针或者引用调用虚函数时,该调用将被动态绑定。根据引用或者指针所绑定的对象类型不同,该调用可能执行基类的版本也可能执行某个派生类的版本。在某些时候基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符来说明这样的成员。
基类通过在其成员函数声明语句之前加上关键字virtual使得改函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。
之后会详细介绍虚析构造函数,现在只用记住作为继承关系中根节点的类(基类)通常都会定义一个虚析构造函数。即本例中的 virtual ~Parent()=default。基类通常应该定义一个虚析构造函数,即使该函数不执行任何实际操作也是如此(原因等后面随笔的解释——不这样可能会导致内存泄漏,释放子类的资源同时也要释放父类的资源才行)。
代码操练:
1 #include<iostream>
2 using namespace std;
3 class Parent {
4 public:
5 Parent():a(0),b(0),c(0){}
6 virtual ~Parent() = default;
7 int a;
8 protected:
9 int b;
10 private:
11 int c;
12 };
13 //public继承
14 class Child1 :public Parent{
15 public:
16 void test()
17 {
18 a = 0;//√基类共有的属性派生类可以随意访问
19 b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问
20 // c = 0;//× 基类私有属性可以继承但不能访问
21 }
22 protected:
23
24 private:
25 };
26 //private继承
27 class Child2 :private Parent {
28 public:
29 void test()
30 {
31 a = 0;//√基类共有的属性派生类类内可以随意访问,就算是private继承也可以,但是派生类外不能访问
32 b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,就算是private继承也可以,但是派生类外不能访问
33 //c = 0;//× 基类私有属性可以继承但不能访问
34 }
35 protected:
36
37 private:
38 };
39 //protected继承
40 class Child3 :protected Parent {
41 public:
42 void test()
43 {
44 a = 0;//√基类共有的属性派生类类内可以随意访问,派生类外不能访问
45 b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,派生类外不能访问
46 //c = 0;//× 基类私有属性可以继承但不能访问
47 }
48 protected:
49
50 private:
51 };
52 int main()
53 {
54 Child1 c1;
55 c1.a = 10;//√
56 //c1.b = 20;//× 受保护的属性不能在类外访问
57 //c1.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
58
59 Child2 c2;
60 //c2.a = 10;//× private继承基类的共有属性也不可以在类外访问
61 //c2.b = 20;//× 受保护的属性不能在类外访问
62 //c2.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
63
64 Child3 c3;
65 //c3.a = 10;//× protected继承基类的共有属性也不可以在类外访问
66 //c3.b = 20;//× 受保护的属性不能在类外访问
67 //c3.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
68 cout << "hello world!
";
69 return 0;
70 }
summary:
一个类的pubulic属性在类内、类外都可以访问,
private属性只能在这个类内访问,
protected属性可以在这个类内访问也可以在这个类的派生类类内中访问,不能在基类和派生类外部访问。
总结表如下:
基类权限: public private protected
继承权限:public 继承 public private protected
private继承 private private private
protected继承 protected private protected
继承访问权限三看原则:
①:看使用的方法在类的内部还是外部
②:看子类的继承权限(public private protected)
③:看基类的权限(public private protected)