回顾

类中有三种属性划分

1
2
3
4
5
class Box{
public: //公有
private: //私有
protected: //受保护的
}

而前面继承的时候我们都用的public,其实其他两种也能使用。
只不过访问方式就产生变化了。


正文

1
2
3
class Box :  属性 基类{

}

三种继承属性*三种成员属性。它的访问方式就变得复杂了。


public

1
2
3
class Box : public 基类{

}

这个时候,就是之前学的状态。
公有都基类派生类可以访问
私有只有基类可以访问
受保护的基类可以访问、派生类只能由成员函数访问


protected

1
2
3
class Box : protected 基类{

}

如果继承方式变成protected。访问的权限就又变了。
public就变成了protected。
然后私有还是私有。
以之前的例子:

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

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

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

当grandson处于protected继承时。
实例化的对象,就只能访问sex了。

当然同时保持之前的规则,派生类中是可以访问到son的public成员的。

1
2
3
4
5
6
7
8
9
class grandson : protected son{
public:
int sex;
grandson(){
height=200;
age = 10;
weight = 20.0f;
}
};

private

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

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

class grandson : private son{
public:
int sex;
grandson(){
height=200;
age = 10;
weight = 20.0f;
}
};

当grandson以private继承son的时候。
son的成员在grandson中就都变成了private
私有的成员我们知道只能在类中访问。
他与protected存在的差异就是当这个grandson再次被别人以public继承的时候。
基类成员都处于private状态,是不可访问的。

1
2
3
4
5
6
class box : public grandson{
public:
box(){

}
}

压根找不到的


继承原则大概就是这样


修改继承的访问属性

using 基类名::成员名
注意:基类中的私有成员属性是依旧无法修改的,因为本身就不可能访问

1
2
3
4
5
6
7
8
9
10
11
12
13
class son: public father{
public:
int age;
float weight;
protected:
int height;
};

class grandson : private son{
public:
int sex;
using son::height;
};

按常理来说,这种情况由grandson实例化的对象是无法访问到其中的成员的。
但是经过using修改,就可以达到效果

因为grandson是以private继承的son,其中son的public继承过来就变成private了。
我们依然可以通过using修改。

说明unsing修改成public了。

至于私有的成员,它都只能在类中访问了,即使被继承了,也还是不能访问,所以为了贯彻私有,using是改变不了private的属性成员。

你要真的想修改私有的,之前说过在public下定义一个函数,然后赋值。既然using能修改成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class son: public father{
public:
int age;
float weight;
int set(int x){ //提供setter
num = x;
}
private:
int num;
protected:
int height;
};

class grandson : private son{
public:
int sex;
using son::height;
using son::age;
using son::set;
};

这么操作也不是不行,就是勉强了点,而且需要人注意到这个东西。

get和set不常用还容易搞混~~~


继承访问属性的使用

使用不同的属性,肯定有不同的用处

对于private和protected而言,可以更好的封装基类。
在派生类作为基础在进行派生的时候提供继承控制。

  1. 将保护属性为private的基类派生出来的派生类作为父类的时候,派生类继承但不能访问构建其父类的基类成员
  2. 将保护属性为protected的父类产生的子类作为基类的时候,派生类继承且可以访问其非私有成员。

继承访问属性的选择

因为private的成员继承之后也不能访问,所以真的有需求的时候,我们就应该提供getter/setter函数


结语

对于类的继承方式,大多情况还是用的public,其它两种保留印象