公有继续、保护继承、私有继承
公有继续、保护继承、私有继承
派生类可以继承基类中除了构造函数与析构函数(赋值运算符重载也不能被继承)之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性由继承方式控制的。
基类成员 | private | protected | public | private | protected | public | private | protected | public |
---|---|---|---|---|---|---|---|---|---|
派生方式 | private | private | private | protected | protected | protected | public | public | public |
派生类中 | 不可见 | private | private | 不可见 | protected | protected | 不可见 | protected | public |
外部 | 不可见 | 不可见 | 不可见 | 不可见 | 不可见 | 不可见 | 不可见 | 不可见 | 不可见 |
可见,不论哪种继承方式,基类中的私有成员都不允许派生类继承。
派生类对基类成员的访问形式主要有以下两种:
- 内部访问:由派生类中新增的成员函数对基类继承来的成员的访问;
- 对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。
公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|---|---|---|
内部访问 | 不可访问 | 可访问 | 可访问 |
外部访问 | 不可访问 | 可访问 | 不可访问 |
保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|---|---|---|
内部访问 | 不可访问 | 可访问 | 可访问 |
外部访问 | 不可访问 | 不可访问 | 不可访问 |
私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
---|---|---|---|
内部访问 | 不可访问 | 可访问 | 可访问 |
外部访问 | 不可访问 | 不可访问 | 不可访问 |
示例
假设基类是一个即将退休的富豪。代码如下:
class RichMan
{
public:
RichMan();
~RichMan();
int m_company;
private:
int m_money;
int m_car;
protected:
int m_house;
};
公司是public的,那么他自己(基类),创业伙伴(友元),儿子(子类),其他人(外部)都可以访问。
钱和车子是private的,自己(基类),创业伙伴(友元)可以访问。儿子和外人都不给开。
房子是protected的,自己(基类),创业伙伴(友元)可以访问,儿子(子类)也可以访问,外人是不可以访问。
现在他要退休了,那么有三种继承方式:
1.公有继承:public
他的儿子继承了他:LittleRichMan 类
class LittleRichMan :public RichMan
{
public:
LittleRichMan();
~LittleRichMan();
};
经过public继承后,LittleRichMan的成员访问权限就变成了:
#include "RichMan.h"
class LittleRichMan : public RichMan
{
public:
LittleRichMan();
~LittleRichMan();
int m_company;
protected:
int m_house;
};
也就是说,public成员保持不变,private成员不可见,protected成员也保持不变。
他的儿子继续开着公司,住着房子,但他爸爸的车子和钱是拿不到了。
继续,private继承:
class LittleRichMan : private RichMan
{
public:
LittleRichMan();
~LittleRichMan();
private:
int m_company;
int m_house;
};
可以想象他的儿子是个自私的人,通过private的方式继承:public和protected变成了private。
自己占用了公司和房子,这样除了自己和友元,任何方式都不得访问。
最后,protected继承:
class LittleRichMan : private RichMan
{
public:
LittleRichMan();
~LittleRichMan();
protected:
int m_company;
int m_house;
};
原先的public变成了protected,protected保持不变。这样,公司和房子是除了外人不可以访问,自己,友元,子类都可以访问。