前言

我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

1
2
3
class<派生类名>:<继承方式><基类名>{
<派生类新定义成员>
};

正文

1
2
3
4
5
6
7
8
9
10
11
12
class father{
public:
char name[20];
};

class son{
public:
char name[20];
int age;
float weight;
//。。。。。
};

像这种其实有共同属性的时候,就可以通过继承。

  1. 子类不能继承父类的构造函数、析构函数、重载赋值运算符
  2. 子类只能继承父类的成员变量以及常规成员函数
1
2
3
4
5
6
7
8
9
10
class father{
public:
char name[20];
};

class son: public father{
public:
int age;
float weight;
};

如何看是否继承了,最简单的就是看两个类的内存大小。

看到father 20没问题,son是28?
从结构上看就只有俩成员int和float加在一起也是8,多余的20自然是从父类那边继承过来的。

1
2
3
4
class grandson : public son{
public:
int sex;
};

再添加一个类继承son,看看内存变化

结果是32,又多了一个4,这个4自然就是自带的属性sex。


public继承,就只能继承到public下的成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class father{
public:
char name[20];
};

class son: public father{
private:
int age;
float weight;
};

class grandson : public son{
public:
int sex;
};

当son的成员变成私有的时候,由grandson构造的类对象就无法访问到其中的属性了

1
2
3
4
5
6
7
class son: public father{
private:
int age;
float weight;
protected:
int height;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class father{
public:
char name[20];
};

class son: public father{
private:
int age;
float weight;
};

class grandson : public son{
public:
int sex;
};

私有的成员虽然继承之后不可访问,但是同样会占用内存。

引出一个新的属性,protected
它的作用在类中其实跟私有差不多,但是可以被类本身和友元函数调用。
当然最主要的是他可以被继承,只不过比较特别

只能通过派生类或者说子类的成员函数中访问。

protected又称受保护的:

  1. 可访问的范围比私有的大一点
  2. 除了基类就只能在派生类的成员函数中访问

final

当类加了final修饰后,他就不能作为基类使用了。

而且final比较有意思的这个关键字可以做变量名,他没有那么严格要求


结语

过一遍继承属性,这个还没区分当不是public继承基类的时候的区别。